2010-02-23 63 views
5

這兩段代碼有什麼區別?在Oracle中,open-for和使用參數打開遊標有什麼區別?

TYPE t_my_cursor IS REF CURSOR; 
v_my_cursor t_my_cursor; 
OPEN v_my_cursor FOR SELECT SomeTableID 
     FROM MYSCHEMA.SOMETABLE 
     WHERE SomeTableField = p_parameter; 

而且......

CURSOR v_my_cur(p_parameter VARCHAR2) IS 
SELECT SomeTableID 
FROM MYSCHEMA.SOMETABLE 
WHERE SomeTableField = p_parameter; 

OPEN presf_cur(p_subscriber_id); 

他們都似乎工作。他們是一樣的還是有一些差異,我應該知道?

回答

6

第二個示例是顯式遊標,它是靜態的。也就是說,它是一個與一個SQL語句相關的變量。有一個隱含的等價物...

FOR lrec in (SELECT SomeTableID 
       FROM MYSCHEMA.SOMETABLE 
       WHERE SomeTableField = p_parameter) 
LOOP 
    do_something_with (lrec.sometableid); 
END LOOP; 

第一個示例是ref cursor,它是一個指向SQL語句的指針,因此可以是動態的。例如,我們可以擴展這個例子是這樣的:

TYPE t_my_cursor IS REF CURSOR; 
v_my_cursor t_my_cursor; 

... 

if flag = 1 then 
    OPEN v_my_cursor FOR SELECT SomeTableID 
     FROM MYSCHEMA.SOMETABLE 
     WHERE SomeTableField = p_parameter; 
else 
    OPEN v_my_cursor FOR SELECT SomeTableID 
     FROM MYSCHEMA.ANOTHERTABLE 
     WHERE AnotherTableField = p_parameter; 
end if; 

甚至:

l_stmt := 'SELECT * FROM your_table WHERE '; 
    if p_parameter is not null then 
     l_stmt := l_stmt ||'id = :1'; 
     open v_my_cursor for l_stmt using p_parameter; 
    else 
     l_stmt := l_stmt ||'created_date > trunc(sysdate)'; 
     open v_my_cursor for l_stmt; 
    end if; 

所以使用參考光標爲我們提供了在其被執行最終的SQL語句更多的控制。另一個區別是,因爲引用遊標是一個指針,所以它可以在程序之間傳遞。這對於將數據從PL/SQL傳遞到其他語言非常有用,例如JDBC結果集。

5
  1. 強類型遊標可以'描述'。
  2. 如果你建立一個 API(包),你可以在 規範級別將您 光標定義,並給予 客戶端程序員的 你的API不和,而無需知道的返回 更好的感覺 源代碼。
  3. 佈局/ IDE/GUI工具 可能會與名爲 遊標更好地發揮。
  4. 有一個已知類型的遊標可能是微不足道的性能優勢;但我不會指望它有任何意義。
相關問題