create or replace procedure proc_advertisement(CustomerID in Number,NewspaperID in number,StaffID in Number,OrderDate in date,PublishDate in date,Type in varchar,Status in varchar,Units in number) is
begin
insert into PMS.Advertisement(CustomerID,NewspaperID,StaffID,OrderDate,PublishDate,Type,Status,Units)
values(CustomerID,Units);
dbms_output.put_line('Advertisement Order Placed Successfully');
end;
如何检查在执行过程期间是否发生任何错误,如果发生任何错误,我希望显示错误消息.
解决方法
首先,如果在运行过??程时发生任何错误,Oracle本身将引发错误消息 – 例如:
ORA-02291: integrity constraint (EMP.MGR_FK) violated - parent key not Found
您可以通过编写异常处理程序来显式处理错误,但除非您做得好,否则您很可能只是混淆问题.例如,你可以简单地添加它(就在程序结束之前:
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001,'An error occured');
但是现在你的用户不会知道什么样的错误,而在他们可以推断出指定的Manager不存在之前.你可以像这样显示原始错误:
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001,'An error occured: '||SQLERRM);
如果这增加任何价值.或者您可以只显示一般错误,然后将SQLERRM的值写入日志表.
您还可以处理特定的例外情况:例如
PROCEDURE ... IS
e_invalid_fk EXCEPTION;
PRAGMA EXCEPTION_INIT(e_invalid_fk,-2291);
BEGIN
...
EXCEPTION
WHEN e_invalid_fk THEN
IF SQLERRM LIKE '%(EMP.MGR_FK)%' THEN
raise_application_error(-20001,'Invalid manager specified');
ELSE
RAISE;
END IF;
END;
注意RAISE:如果您的异常处理程序的任何部分没有发出RAISE或RAISE_APPLICATION_ERROR,那么您实际上是在地毯下扫描异常 – 用户会认为该过程有效.
顺便说一句,DBMS_OUTPUT.PUT_LINE非常适合在SQL Plus或IDE中尝试和调试,但它在实际代码中没有位置,因为调用该过程的用户和应用程序永远不会看到它产生的输出.