Plsql PL/SQL包和过程
我试图在一个包中使用一个过程,这样我就可以调用一个外部程序。我不断收到一个遇到符号“CREATE”错误的消息。我尝试了很多不同的方法,所以如果我的代码很混乱,我很抱歉,我真的很迷茫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 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很高兴知道你已经解决了你的错误。