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中尝试和调试,但它在实际代码中没有位置,因为调用该过程的用户和应用程序永远不会看到它产生的输出.