使用'ORA-04063:package body“...”调用时,成功编译的Oracle包失败

时间:2013-06-24 10:36:23

标签: oracle compilation compiler-errors package

我有一个用于保持面向报告的代码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,它可以正常工作。

我开始认为这是一个系统问题?

还有其他人有这个问题吗?

此致 戴夫

2 个答案:

答案 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