【问题标题】:Oracle - How to have an out ref cursor parameter in a stored procedure?Oracle - 如何在存储过程中有一个 out ref 游标参数?
【发布时间】:2010-10-26 12:36:28
【问题描述】:

我们的应用程序将信息从 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;

没用。

【问题讨论】:

    标签: oracle scoping


    【解决方案1】:
    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;
    

    【讨论】:

    • ? := crsr_test_result 行是因为 Java JDBC 应用程序正在调用此 sql 块并获取 ref 游标。当我想用 java 中的 pl/sql 完成某些事情而不将逻辑放在存储过程中时,这是我的速记技术。但它也很容易成为一个存储过程。
    • 我认为不可能,因为必须有一个 refcur 类型的参数,它超出了您创建类型的范围。
    【解决方案2】:

    试试这个:

    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 的目的是什么?包中还有几行代码,过程签名在包规范和包主体中重复,但在包中包含过程提供了几个重要的好处。

    【讨论】:

    • Q1: ERROR line 1, col 23, ending_line 1,ending_col 25, 找到 'REF', Expecting: ARRAY OBJECT OPAQUE TABLE VARRAY VARYING Q2 - 此应用程序只使用了几个存储过程,并且他们都被转移到一个新的 oracle 用户似乎没有必要让包参与进来
    【解决方案3】:

    我不能在这里测试它(没有 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

    【讨论】:

      猜你喜欢
      • 2012-08-08
      • 2011-10-16
      • 1970-01-01
      • 2013-11-02
      • 2013-04-24
      • 1970-01-01
      • 2012-03-27
      • 2018-02-27
      • 2012-03-11
      相关资源
      最近更新 更多