CREATE OR REPLACE PROCEDURE GetEmployeesInDept( c OUT SYS_REFCURSOR)
我有一个与上述存储过程相关的查询, 那是在定义游标时我们将其称为sys_refcursor,在某些我们的网站中我将其视为REF CURSOR,如图所示
创建或替换过程GetEmployeesInDept(c out ref cursor)
请告诉我ref cursor和sys_refcursor有什么区别。
答案 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_REFCURSOR
在STANDARD
包中定义为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
可以是STRONG
或WEAK
类型,而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的错误:
3/4 PL / SQL:项目被忽略 3/4 PLS-00994:游标变量不能声明为a的一部分 封装