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
的各种类型。两者之间可能有一个区别,我可以认为isref\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> /