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

Plsql 在存储过程参数中使用ref cursor vs sys_refcursor,plsql,Plsql,我有一个关于上述存储过程的查询, 也就是说,在定义游标时,我们将其称为sys\u refcursor,在一些网站中,我将其视为REF cursor,如图所示 CREATE OR REPLACE PROCEDURE GetEmployeesInDept( c OUT SYS_REFCURSOR) 请告诉我ref游标和sys\u ref游标之间的区别是什么,我不知道你的意思 create or replace procedure GetEmployeesInDept( c out ref

我有一个关于上述存储过程的查询, 也就是说,在定义游标时,我们将其称为
sys\u refcursor
,在一些网站中,我将其视为REF cursor,如图所示

CREATE  OR  REPLACE  PROCEDURE GetEmployeesInDept( c OUT  SYS_REFCURSOR)

请告诉我ref游标和sys\u ref游标之间的区别是什么,我不知道你的意思

create or replace procedure GetEmployeesInDept( c out ref cursor)
我以前从未见过这种情况,也无法编译这样声明的过程。您能提供示例代码或链接到您以前见过的地方吗

您可能会看到以下内容:

create or replace procedure GetEmployeesInDept( c out ref cursor)
在本例中,我们将一个类型声明为
REF CURSOR
,并将其用作存储过程中的
OUT
参数

使用声明为
REF-CURSOR
的类型与使用
SYS\u-REFCURSOR
没有区别,因为
SYS\u-REFCURSOR
标准
包中定义为
REF-CURSOR
的方式与声明类型
REF\u-CURSOR
的方式相同。事实上,如果您使用的是Oracle 9i或更高版本,请查看Oracle数据库安装中的
%Oracle\u HOME%\rdbms\admin\stdspec.sql
,您应该在其中找到以下行:

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;
/

SYS\u REFCURSOR
是在Oracle 9i中引入的。您可以在Oracle 9i发布之前编写的PL/SQL代码中找到声明为
REF CURSOR
的各种类型。

两者之间可能有一个区别,我可以认为is
ref\u cursor
可以是
STRONG
WEAK
类型,而
SYS\u REFCURSOR
始终是弱类型,因为它是这样定义的。

检查以下差异:

1) 使用ref游标

type sys_refcursor is ref cursor;
包已创建

                        SQL> CREATE OR REPLACE package p19
                          2  as
                          3         PROCEDURE p;
                          4  END;
                          5  /
2) 使用Sys_Refcursor:

                      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.
包已创建

SQL>ed 已写入文件afiedt.buf

        SQL> CREATE OR REPLACE package p19
             2  as
             3      PROCEDURE p;
             4  END;
             5  /
警告:创建的包体存在编译错误

SQL>显示错误 包体P19的错误:

行/列错误 3/4 PL/SQL:忽略项 3/4 PLS-00994:游标变量不能声明为

ref游标有两种形式,即强ref游标 和弱参考光标。PL/SQL是一种静态类型语言,弱引用 游标是为数不多的受支持的动态类型构造之一

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

当您定义系统参考光标时,它是预定义的弱参考光标类型。

一个强大的参考光标它是这样的:

类型book\u data\t为参考光标返回book%行类型


原因将游标变量与特定的记录结构相关联。

另请参见《Oracle数据库PL/SQL语言参考》(11.2)。抱歉,您的示例有误导性。在第一个示例中,您只需声明一个包级别类型。在第二个示例中,您声明了一个包级别变量。这是两件不同的事情。基本上,我的意图是让你知道sys_refcursor和refcursor之间的主要区别。基本上,你没有表现出任何区别,因为你是在比较苹果(类型)和橙子(变量)。我的意思是,我们不能将sys_refcursor EXTER声明为全局变量,但我们可以在全局级别声明refcursor。有关信息,请查看以下链接,您可以在全局级别声明refcursor类型。尝试在示例-1-包中声明类型为
s
的变量。
                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> /