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

11 plsql

CREATE  OR  REPLACE  PROCEDURE GetEmployeesInDept( c OUT  SYS_REFCURSOR)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Luk*_*ard 16

我不确定你的意思

create or replace procedure GetEmployeesInDept( c out ref cursor)
Run Code Online (Sandbox Code Playgroud)

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

您可能会看到的内容如下:

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;
/
Run Code Online (Sandbox Code Playgroud)

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

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

type sys_refcursor is ref cursor;
Run Code Online (Sandbox Code Playgroud)

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