Проверка на ошибки во время выполнения процедуры в Oracle - PullRequest
4 голосов
/ 29 апреля 2010
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 Ответ

7 голосов
/ 29 апреля 2010

Прежде всего, сама 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: если какая-либо часть вашего обработчика исключений не выдает ни RAISE, ни RAISE_APPLICATION_ERROR, тогда вы фактически подметаете исключение под ковром - пользователь будет думать, что процедура сработала.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...