2010-09-28 42 views
0

我想這樣做與PL/SQL:PL/SQL - 嵌套查詢中使用的變量

for ACCOUNT in account_cursor 
loop 

    for related_data in (select something from table where some_column = ACCOUNT.column) 
    loop 

    endloop;  

endloop; 

(上限強調)

我從我的開發遠環境,所以我不能測試這個,所以請忽略任何小的語法錯誤。我更關心我是否可以用這種方式使用變量。

編輯:

我試圖實現什麼的探索。我有兩個巨大的表:帳戶和日誌。我想獲取特定幾個帳戶的日誌數據。由於直接選擇/連接的記錄數量非常緩慢。我試圖通過首先選擇我感興趣的帳戶並將這些帳戶加入日誌表來加速此過程。任何意見,將不勝感激。

回答

3

你似乎是混合的顯式遊標(account_cursor)與隱式遊標(related_data)...

從ENDLOOP

除了需要是END LOOP,它的語法正確&有效。你可以see examples of both types of cursors in this link。但我不知道你實際上在做什麼,看看光標方法是否真的是必要的。

+0

基本上我有兩個非常大的表。我想選擇少量的帳戶,並在數據表中獲取所有條目。我用joins/where子句編寫了查詢,我正在尋找使用這種方法可能的速度改進。 – Peter 2010-09-28 19:45:34

+0

+1「但是我不知道你實際上在做什麼,看看光標方法是否真的有必要。」大多數情況下,這是不必要的,對性能影響很大。 – 2010-09-28 19:45:36

+1

@Peter:數據庫是基於SET的,而不是程序/ OO。很可能單個查詢是最好的選擇,但沒有詳細信息,很難提供示例。 – 2010-09-28 19:53:09

0

請在使用此方法之前閱讀上面的回覆。技術上,是的,你可以訪問變量..這樣的東西。

for v_dept_rec in (select deptno from dept where deptno in (10,20)) loop 
    for v_emp_rec in (select empno from emp where deptno = V_DEPT_REC.DEPT_NO) loop 

     <<<Process here>> 

    end loop; 
end loop; 

「我已經寫了使用 加入/查詢的WHERE子句和我使用 這種做法正在尋找 可能的速度提升」

不變的是,這是相當緩慢這是逐行處理。如果您可以爲您的邏輯發佈代表性代碼,您將得到響應,指出如何在集合中處理相同的代碼。

0

正如Rajesh所觀察到的,在光標中這樣做會非常緩慢。

如果查詢沒有使用合適的索引,相對較少的值的直接選擇/連接應該只在較大的表上較慢 - 檢查帳號和日誌表中是否存在索引。如果他們這樣做,請檢查您的查詢是否在解釋計劃中使用它們。