第二個示例是顯式遊標,它是靜態的。也就是說,它是一個與一個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結果集。
來源
2010-02-23 03:53:00
APC