在oracle中执行过程期间检查错误

时间:2010-04-29 02:20:13

标签: oracle stored-procedures

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,NewspaperID, StaffID, OrderDate, PublishDate, 
Type, Status, Units); 
dbms_output.put_line('Advertisement Order Placed Successfully'); 
end;

如何检查在执行程序期间是否发生任何错误,如果发生任何错误,我希望显示错误消息。

1 个答案:

答案 0 :(得分:7)

首先,如果在运行该过程时发生任何错误,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中进行尝试和调试,但它在实际代码中没有位置,因为调用该过程的用户和应用程序永远不会看到它产生的输出。