【问题标题】:PL/SQL Packages and ProceduresPL/SQL 包和过程
【发布时间】:2014-11-03 23:58:14
【问题描述】:

我正在尝试使用包中的过程,以便可以在外部程序中调用。我不断遇到符号“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;

【问题讨论】:

    标签: plsql packages procedure sys-refcursor


    【解决方案1】:

    您在包规范中定义了函数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;
    /
    

    【讨论】:

    • 我尝试了您的代码,但仍然遇到符号“CREATE”
    • @BrendonRother 您使用的是哪个版本的SQLDeveloper?
    • @BrendonRother 我已经更新了我的答案。当您从SQLDeveloepr 运行时,您在包规范和包正文的末尾添加/。
    • 做到了!非常感谢,我一直在用/,但没想到用它来做包
    • @BrendonRother 很高兴知道您已经解决了错误。
    【解决方案2】:

    要分析这些问题,编译包后执行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,但不要在主体中实现它

    【讨论】:

    • 感谢 Peter 只是在显示错误时遇到了一些麻烦,无法输出与您显示的相同数量的详细信息,它只是输出与我得到的相同的错误。如果有影响,我正在使用 Oracle SQL Developer
    • 要查看 SQL Developer 中的错误,请尝试同时执行 CREATE-statement 和 SHOW ERROR,使用 F5。 Viewing PLSQL Compilation Errors in Oracle SQL Developer 提供更多信息。
    猜你喜欢
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    相关资源
    最近更新 更多