2010-04-29 3 views
4
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; 

Как проверить, произошла ли ошибка во время выполнения процедуры и произошла ли какая-либо ошибка, тогда я хочу отобразить сообщение об ошибке.Проверка ошибки при выполнении процедуры в oracle

ответ

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'); 

Но теперь ваш пользователь не будет знать, какие ошибки, в то время как прежде, чем они могли бы сделать вывод, что это было то, что указанный руководитель не сделал . существуют можно показать исходное сообщение об ошибке также, как это:..

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_application_error то вы фактически подметает исключение под ковер - пользователь будет думать, что процедура работает.

Кстати, DBMS_OUTPUT.PUT_LINE отлично подходит для тестирования и отладки в SQL Plus или IDE, но в реальном коде нет места, поскольку пользователи и приложения, вызывающие эту процедуру, никогда не смогут увидеть вывод, который он производит ,

+0

+1 - сделал все пункты, которые я собирался сделать, особенно непригодность DBMS_OUTPUT для обработки ошибок (исключение в нескольких особых случаях). – APC

+0

+1, мне также нравится raise_application_error (xxx, msg, ** TRUE **), таким образом, стек ошибок сохраняется. Это полезно как для конечного пользователя, так и для поддержки. –

+0

Я всегда забываю третий параметр! –