0

我有一个 pkg 用于保存面向报告的代码 CMS_REPORTS。

我添加了一个返回 ref 游标的过程,并且 pkg 编译得很好,但是当我调用 proc 来测试它时失败: ORA-04063: package body "CMS.CMS_REPORTS" has errors ORA-06508: PL/SQL: could not查找正在调用的程序单元:“CMS.CMS_REPORTS”

我已经删除了 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,它工作正常。

我开始怀疑是系统问题?

有没有其他人有这个问题?

问候戴夫

4

2 回答 2

1

很难说这里有什么问题,因为看起来我们没有看到相关代码。

所以这里有一些事情我建议仔细检查:

  • 包和包体都在那里,并且实际上没有例外地编译

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

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

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

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

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

于 2013-06-24T10:44:57.380 回答
0

In order to achieve what you want you have to use 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

... and example:

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

Since Oracle 7.3 the REF CURSOR type has been available to allow recordsets to be returned from stored procedures and functions. Oracle 9i introduced the predefined SYS_REFCURSOR type, meaning we no longer have to define our own REF CURSOR types.

Source: http://www.oracle-base.com/articles/misc/using-ref-cursors-to-return-recordsets.php

于 2013-06-24T13:52:53.537 回答