我们的应用程序将信息从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;
不起作用。
答案 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)将程序移出包装会有什么用途?包中还有一些代码行,在包规范和包体中重复了过程签名,但是在包中包含过程提供了几个重要的好处。