使用“ORA-04063:程序包正文”调用成功编译的Oracle程序包时失败…“有错误”

使用“ORA-04063:程序包正文”调用成功编译的Oracle程序包时失败…“有错误”,oracle,compilation,compiler-errors,package,Oracle,Compilation,Compiler Errors,Package,我有一个pkg,用于保存面向报告的代码CMS\u报告 我添加了一个返回ref游标的过程,pkg编译得很好,但调用proc进行测试时失败: ORA-04063:包体CMS.CMS_报告有错误 ORA-06508:PL/SQL:找不到正在调用的程序单元:CMS.CMS\u报告 我已经删除了orig proc,并用它来替换它,以保持简单-同样的问题 过程如下: procedure test_ref_cur(p_testno in number, p

我有一个pkg,用于保存面向报告的代码CMS\u报告

我添加了一个返回ref游标的过程,pkg编译得很好,但调用proc进行测试时失败: ORA-04063:包体CMS.CMS_报告有错误 ORA-06508:PL/SQL:找不到正在调用的程序单元:CMS.CMS\u报告

我已经删除了orig 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规范中定义了ref游标,如下所示:

 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,它可以正常工作

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

还有其他人有这个问题吗

问候
Dave

很难说问题出在哪里,因为我们似乎没有看到相关的代码

因此,我建议您仔细检查以下几点:

包和包体都存在,并且实际上编译时没有异常

您位于包含包和包体的架构/用户中

没有具有相同名称的其他对象可能会隐藏您的包/包体

您尝试调用的过程存在于包和包体中

删除包+包体中的所有代码,除了一个简单的过程,并检查其是否有效


如果您已经完成了所有这些,请使用结果更新问题。

为了实现您想要的结果,您必须使用SYS\u 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游标类型就可以允许 从存储过程和函数返回的记录集。神谕 9i引入了预定义的SYS_REFCURSOR类型,这意味着我们不再 必须定义我们自己的引用游标类型


来源:

您如何知道该软件包是否编译?我见过一些工具设置,它们看起来都很好,但是包实际上没有被编译,所以只有在明确编译或启动时,才会出现问题。显示错误会给您带来什么,或者如果您的客户端不支持,请从user_errors中选择*,其中键入“PACKAGE%”,name=“CMS_REPORTS”?你所展示的对我来说编译和运行都很好,所以图片中缺少了一些东西;问题是他对sys_refcursor也有同样的问题。