1

我们的应用程序将信息从 oracle 存储过程传递到 oracle .net 提供程序的标准方式是通过 out ref 游标参数。

过去我们所有的存储过程都在包中,并且有这样的东西:

CREATE OR REPLACE PACKAGE test_package IS
   TYPE refcur IS REF CURSOR;
   PROCEDURE get_info ( o_cursor            OUT      refcur );
END test_package;
/
CREATE OR REPLACE PACKAGE BODY test_package IS
   PROCEDURE get_info ( o_cursor            OUT      refcur ) AS
   BEGIN
     OPEN o_cursor FOR
       SELECT * FROM v$database;
   END get_info;
END test_package;
/

现在我想将该 get_info 过程移出包并进入常规过程,但不知道如何获取 refcur 类型。如何在包范围之外创建它?

创建或替换类型 refcur 是 REF CURSOR;

不起作用。

4

3 回答 3

8

我不能在这里测试它(没有 Oracle),但你可以这样做:

create or replace procedure get_info(p_cursor out sys_refcursor)
is
begin
  open p_cursor for
    select *
    from   v$database; 
end;
/

在 Oracle 9 及更高版本中,不再需要声明TYPE result_crsr IS REF CURSOR

请改用sys_refcursor

于 2009-05-15T16:45:04.060 回答
0
TYPE result_crsr IS REF CURSOR;

使用 ref 游标的匿名 SQL 块示例:

DECLARE
   TYPE result_crsr IS REF CURSOR;
   crsr_test_result   result_crsr;
BEGIN


   OPEN crsr_test_result FOR
        SELECT * from user_objects;
     ? := crsr_test_result;
END;
于 2009-05-15T14:37:48.970 回答
0

试试这个:

CREATE OR REPLACE PROCEDURE get_info(o_cursor OUT sys_refcursor) IS
BEGIN
  OPEN o_cursor FOR SELECT * FROM dual;
END;
/

您的问题提出了两个重要问题:

1)你说它“不起作用”。我认为这意味着当您执行该语句时,Oracle 正在返回一个异常。Oracle 返回的错误消息是什么?它应该以 ORA-nnnnn 开头,然后是一些文本。

2) 将 PROCEDURE 从 PACKAGE 中移出可以达到什么目的?包中还有几行代码,过程签名在包规范和包体中重复,但在包中包含过程提供了几个重要的好处。

于 2009-05-15T14:45:18.623 回答