REF CURSOR在Oracle中的作用是什么?为什么我们需要一个SQL语句,即
OPEN c2 FOR sqlstmt USING c3_rec.id;
这是光标代码,请帮助。
TYPE cur_ref IS REF CURSOR;
c2 cur_ref;
sqlstmt VARCHAR2(2000);
total INTEGER;
sqlstmt:='SELECT COUNT(*) total FROM "'||owner||'".'||table||' WHERE '||:NEW.cname||' = :1';
OPEN c1 FOR sqlstmt USING :NEW.min;
BEGIN
OPEN c2 FOR sqlstmt USING c3_rec.id;
FETCH c2 INTO total;
CLOSE c2;
EXCEPTION
WHEN others THEN
error(1006, id: %s %s raised by: %s')
答案 0 :(得分:1)
REF CURSOR在Oracle中的作用是什么?为什么我们需要SQL语句
REF Cursor的基本用法是,它可以在服务器上打开并作为一个单元传递给客户端,而不是一次取一行。它可以作为参数传递给其他程序单元。
现在进入SQL语句,执行时将获取所需的行。 ref游标保存由SQL语句返回的记录集。
因此,REF Cursor是一种数据类型,它以与VARCHAR2变量保存字符串值相同的方式保存游标值。
是的,Oracle 9i引入了预定义的SYS_REFCURSOR以避免您自己的REF CURSOR类型。但是,它是一个弱的引用游标类型。定义良好的井光标被认为是强引用光标类型。
您会在$ORACLE_HOME/rdbms/admin/stdspec.sql
中找到有趣的内容:
/* Adding a generic weak ref cursor type */
type sys_refcursor is ref cursor;
简而言之,两者都是一样的。
所以,在你的情况下,这个:
TYPE cur_ref IS REF CURSOR;
c2 cur_ref;
可以写成:
c2 SYS_REFCURSOR;
答案 1 :(得分:0)
使用REF CURSOR
可以使代码更加灵活,例如:
declare
type t_c1 is ref cursor;
c1 t_c1;
l_count number(10);
l_object_type varchar2(50);
begin
l_object_type := 'TABLE';
open c1 for 'SELECT count(*) from user_objects where object_type = :object_type' using l_object_type;
fetch c1 into l_count;
close c1;
DBMS_OUTPUT.put_line('You have ' || l_count || ' tables');
l_object_type := 'VIEW';
open c1 for 'SELECT count(*) from user_objects where object_type = :object_type' using l_object_type;
fetch c1 into l_count;
DBMS_OUTPUT.put_line('You have ' || l_count || ' views');
close c1;
l_object_type := 'INDEX';
open c1 for 'SELECT count(*) from user_objects where object_type = :object_type' using l_object_type;
fetch c1 into l_count;
close c1;
DBMS_OUTPUT.put_line('You have ' || l_count || ' indexes');
END;
You have 32 tables
You have 0 views
You have 57 indexes
Statement processed.
如果您不想申报自己的参考光标类型,可以使用预先构建的SYS_REFCURSOR
类型。