第二个例子是显式游标,它是静态的。也就是说,它是与一个sql语句关联的变量。有一个隐含的等价物…
FOR lrec in ( SELECT SomeTableID
FROM MYSCHEMA.SOMETABLE
WHERE SomeTableField = p_parameter )
LOOP
do_something_with (lrec.sometableid);
END LOOP;
第一个例子是ref游标,它是指向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;
因此,使用ref游标可以让我们对最终执行的sql语句有更多的控制。另一个区别是,因为ref游标是一个指针,所以它可以在程序之间传递。这对于将数据从pl/sql传递到其他语言(例如jdbc结果集)非常有用。