在Oracle中,为打开和使用参数打开光标有什么区别?
这两段代码之间有什么区别在Oracle中,为打开和使用参数打开光标有什么区别?,oracle,plsql,Oracle,Plsql,这两段代码之间有什么区别 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 SomeTable
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);
他们两个似乎都工作。它们是相同的还是有一些我应该注意的差异
第二个示例是显式游标,它是静态的。也就是说,它是一个与一条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结果集)非常有用