在存储过程参数中使用ref cursor vs sys_refcursor

时间:2011-07-24 09:09:46

标签: plsql

CREATE  OR  REPLACE  PROCEDURE GetEmployeesInDept( c OUT  SYS_REFCURSOR)

我有一个与上述存储过程相关的查询, 那是在定义游标时我们将其称为sys_refcursor,在某些我们的网站中我将其视为REF CURSOR,如图所示

创建或替换过程GetEmployeesInDept(c out ref cursor)

请告诉我ref cursor和sys_refcursor有什么区别。

4 个答案:

答案 0 :(得分:16)

我不确定你的意思

create or replace procedure GetEmployeesInDept( c out ref cursor)

我以前没见过这个,我不能得到这样的程序来编译。您能否提供示例代码或链接到您之前看过的地方?

您可能看到的内容如下:

CREATE OR REPLACE PACKAGE demo AS

  TYPE ref_cursor IS REF CURSOR;

  PROCEDURE GetEmployeesInDept(c OUT ref_cursor);

END demo;
/

CREATE OR REPLACE PACKAGE BODY demo AS

  PROCEDURE GetEmployeesInDept(c OUT ref_cursor)
  IS
  BEGIN
    RAISE NO_DATA_FOUND;
  END GetEmployeesInDept;

END demo;
/

在这种情况下,我们将类型声明为REF CURSOR,并将其用作存储过程中的OUT参数。

使用声明为REF CURSOR的类型与使用SYS_REFCURSOR之间没有区别,因为SYS_REFCURSORSTANDARD包中定义为REF CURSOR与我们声明类型ref_cursor的方式相同。实际上,如果您使用的是Oracle 9i或更高版本,请在%ORACLE_HOME%\rdbms\admin\stdspec.sql中的Oracle数据库安装中查找,并且您应该在其中的某处找到以下行:

type sys_refcursor is ref cursor;
Oracle 9i中引入了

SYS_REFCURSOR。您可能会发现在Oracle 9i发布之前编写的PL / SQL代码中声明为REF CURSOR的各种类型。

答案 1 :(得分:2)

两者之间可能存在一个区别,我可以认为ref_cursor可以是STRONGWEAK类型,而SYS_REFCURSOR总是弱类型,因为它已定义那样。

答案 2 :(得分:2)

有两种形式的ref Cursor强REF CURSOR 以及弱REF CURSOR。 PL / SQL是一种静态类型语言,也是弱REF CURSOR是支持的为数不多的动态类型构造之一。

(静态类型语言:这意味着类型检查 在编译时执行而不是在运行时)

定义SYS_REFCURSOR时是预定义的弱REF CURSOR类型。

一个强大的引用光标就是这样的:

TYPE book_data_t是REF CURSOR RETURN book%ROWTYPE;

使游标变量与特定记录结构相关联。

答案 3 :(得分:-1)

检查以下差异:

1)使用ref cursor

                        SQL> CREATE OR REPLACE package p19
                          2  as
                          3         PROCEDURE p;
                          4  END;
                          5  /

包CREATEd。

                      1  CREATE OR REPLACE package BODY p19
                      2  as
                      3     type s is ref cursor;
                      4     PROCEDURE p
                      5     as
                      6     BEGIN
                      7     NULL;
                      8     END;
                      9* END;
                      SQL> /

                     Package BODY CREATEd.

2)使用Sys_Refcursor:

        SQL> CREATE OR REPLACE package p19
             2  as
             3      PROCEDURE p;
             4  END;
             5  /

包创建。

SQL> ED 写了afiedt.buf文件

                1  CREATE OR REPLACE package BODY p19
                2  as
                3   s sys_refcursor;
                4   PROCEDURE p
                5   as
                6   BEGIN
                7   NULL;
                8   END;
                9* END;
               SQL> /

警告:程序包BODY CREATEd出现编译错误。

SQL>显示错误 PACKAGE BODY P19的错误:

LINE / COL ERROR

3/4 PL / SQL:项目被忽略 3/4 PLS-00994:游标变量不能声明为a的一部分          封装