Plsql PL/SQL包和过程

Plsql PL/SQL包和过程,plsql,packages,procedure,sys-refcursor,Plsql,Packages,Procedure,Sys Refcursor,我试图在一个包中使用一个过程,这样我就可以调用一个外部程序。我不断收到一个遇到符号“CREATE”错误的消息。我尝试了很多不同的方法,所以如果我的代码很混乱,我很抱歉,我真的很迷茫 create or replace package GetAllCust as function GeTAllCust return sys_refcursor; procedure GET_ALLCUST_FROM_DB(pSysRefCur OUT sys_refcursor); end GetAllCust;

我试图在一个包中使用一个过程,这样我就可以调用一个外部程序。我不断收到一个遇到符号“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;

您已经在包规范中定义了函数
GeTAllCust
,但在body中没有指定该函数。 另一个错误是过程体中的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;
/

要分析这些问题,请在编译包后执行
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       
因此有两个问题:

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       
  • 您正在尝试从过程返回一个值。这仅对函数有效
  • 在包头中定义函数
    GeTAllCust
    ,但不在正文中实现它

  • 感谢Peter,只是在获取show error以输出与您显示的相同数量的详细信息时遇到了一些麻烦,它只是输出了与我相同的错误。我使用的是Oracle SQL Developer如果这有什么不同,要查看SQL Developer中的错误,请尝试使用
    F5
    立即执行
    CREATE
    -语句和
    SHOW ERROR
    。提供更多信息。我尝试了您的代码,但仍收到一个错误消息,即符号“CREATE”@BrendonRother您正在使用哪个版本的
    SQLDeveloper
    ?@BrendonRother我已更新了我的答案。当您从
    sqldeveloper
    运行时,您在包规范和包体的末尾添加了
    /
    。这样做了!非常感谢你,我一直在使用/但我没有想过要使用它一段时间package@BrendonRother很高兴知道你已经解决了你的错误。