我有一个用于保持面向报告的代码CMS_REPORTS的pkg。
我添加了一个返回引用游标的过程,并且pkg编译正常,但是当我调用proc来测试它时失败: ORA-04063:包体“CMS.CMS_REPORTS”有错误 ORA-06508:PL / SQL:找不到被调用的程序单元:“CMS.CMS_REPORTS”
我删除了原来的proc并用它来代替它以保持简单 - 同样的问题。
proc是这样的:
procedure test_ref_cur(p_testno in number,
p_cur in out ref_cur) as
begin
open p_cur for
select p_testno + 1 from dual;
end test_ref_cur;
我在pkg规范中定义了引用游标,如下所示:
type ref_cur is ref cursor;
procedure test_ref_cur(p_testno in number,
p_cur in out ref_cur);
我已经尝试过使用ref cursor和sys_refcursor的各种组合,并且都会出现同样的错误。如果我从pkg中删除proc,它可以正常工作。
我开始认为这是一个系统问题?
还有其他人有这个问题吗?
此致 戴夫
答案 0 :(得分:1)
很难说出这里的问题,因为看起来我们看不到相关的代码。
所以我建议仔细检查以下内容:
包和包体在那里,并且实际编译时没有异常
您位于包含包和包体的架构/用户中。
没有其他具有相同名称的对象,可能会隐藏您的包/包体
您尝试调用的过程存在于包和包体中。
从包+包体中删除所有代码,除了一个简单的程序,并检查它是否有效。
如果您已完成所有更新结果的问题。
答案 1 :(得分:0)
为了达到你想要的效果,你必须使用SYS_REFCURSOR:
create procedure test_ref_cur(p_testno in number,
p_cur in out SYS_REFCURSOR) as
begin
open p_cur for
select p_testno + 1 from dual;
end test_ref_cur;
-- PROCEDURE TEST_REF_CUR compiled
......和示例:
DECLARE
l_sysrc SYS_REFCURSOR;
l_num NUMBER;
procedure test_ref_cur(p_testno in number,
p_cur in out SYS_REFCURSOR) as
begin
open p_cur for
select p_testno + 1 from dual;
end test_ref_cur;
BEGIN
test_ref_cur(1, l_sysrc);
FETCH l_sysrc INTO l_num;
DBMS_OUTPUT.PUT_LINE(l_num);
END;
-- Result:
-- 2
自Oracle 7.3起,REF CURSOR类型可供允许 要从存储过程和函数返回的记录集。神谕 9i引入了预定义的SYS_REFCURSOR类型,这意味着我们不再 必须定义我们自己的REF CURSOR类型。
来源:http://www.oracle-base.com/articles/misc/using-ref-cursors-to-return-recordsets.php