Oracle - 如何在存储过程中使用out ref cursor参数?

时间:2009-05-15 14:33:37

标签: oracle scoping

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

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

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;

不起作用。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

TYPE result_crsr IS REF CURSOR;

使用引用游标的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;

答案 2 :(得分: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)将程序移出包装会有什么用途?包中还有一些代码行,在包规范和包体中重复了过程签名,但是在包中包含过程提供了几个重要的好处。