0

我正在尝试使用包中的过程,以便可以调用外部程序。我不断遇到符号“CREATE”错误。我已经尝试了很多不同的方法,所以如果我的代码很乱,我很抱歉,我真的迷失了这个

create or replace package GetAllCust as
function GeTAllCust return sys_refcursor;

procedure GET_ALLCUST_FROM_DB(pSysRefCur OUT sys_refcursor);
end GetAllCust;

create or replace package body GetAllCust as
procedure GET_ALLCUST_FROM_DB (pSysRefCur OUT sys_refcursor) as
begin
    open pSysRefCur for select * from customer;
    return pSysRefCur;
exception
    when others then
        raise_application_error(-20000, SQLERRM);
end GET_ALLCUST_FROM_DB;
 end GetAllCust;
4

2 回答 2

2

您在包规范中定义了函数GeTAllCust,但在正文中未指定。另一个错误是过程主体中的 return 语句,这不是必需的。

尝试将您的包和包体创建为

CREATE OR REPLACE PACKAGE GetAllCust
AS
   FUNCTION GeTAllCust
      RETURN SYS_REFCURSOR;

   PROCEDURE GET_ALLCUST_FROM_DB (pSysRefCur OUT SYS_REFCURSOR);
END GetAllCust;
/

CREATE OR REPLACE PACKAGE BODY GetAllCust
AS
   FUNCTION GeTAllCust
      RETURN SYS_REFCURSOR
   AS
      p_cursor   SYS_REFCURSOR;
   BEGIN
      OPEN p_cursor FOR SELECT * FROM customer;

      RETURN p_cursor;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         raise_application_error (-20001, SQLERRM);
   END GeTAllCust;

   PROCEDURE GET_ALLCUST_FROM_DB (pSysRefCur OUT SYS_REFCURSOR)
   AS
   BEGIN
      OPEN pSysRefCur FOR SELECT * FROM customer;
   EXCEPTION
      WHEN OTHERS
      THEN
         raise_application_error (-20000, SQLERRM);
   END GET_ALLCUST_FROM_DB;
END GetAllCust;
/
于 2014-09-10T11:07:35.610 回答
0

要分析这些问题,SHOW ERROR请在编译包后执行,这将显示问题:

Warning: compiled but with compilation errors
Errors for PACKAGE BODY GETALLCUST

LINE/COL ERROR                                                            
-------- -----------------------------------------------------------------
5/5      PLS-00372: In a procedure, RETURN statement cannot contain an exp

5/5      PL/SQL: Statement ignored                                        
2/10     PLS-00323: subprogram or cursor 'GETALLCUST' is declared in a pac
         kage specification and must be defined in the package body       

所以有两个问题:

  1. 您正试图从过程中返回一个值。这仅对函数有效。
  2. 您在包头中定义函数GeTAllCust,但不在正文中实现它
于 2014-09-10T11:07:59.323 回答