Oracle ref游标使用SQL语句

时间:2014-08-29 07:56:42

标签: sql oracle cursor

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')

2 个答案:

答案 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类型。