В этом учебном материале вы узнаете, как использовать исключительные ситуации, определенные программистом в Oracle/PLSQL c синтаксисом и примерами.
Описание
Иногда для программистов необходимо, определять и перехватывать свои собственные исключительные ситуации - те, которые не определены в PL/SQL.
Синтаксис
Рассмотрим синтаксис исключительных ситуаций определенных программистом в процедуре и функции.
Синтаксис для процедур
[ (parameter [,parameter]) ]
IS
[declaration_section]exception_name EXCEPTION;
BEGIN
executable_section
RAISE exception_name;
EXCEPTION
WHEN exception_name THEN
[statements]
WHEN OTHERS THEN
[statements]
END [procedure_name];
Синтаксис для функций
[ (parameter [,parameter]) ]
RETURN return_datatypeIS | AS
[declaration_section]
exception_name EXCEPTION;
BEGIN
executable_section
RAISE exception_name;
EXCEPTION
WHEN exception_name THEN
[statements]
WHEN OTHERS THEN
[statements]
END [function_name];
Пример
Пример процедуры, в которой используется исключительная ситуация определенная программистом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
CREATE OR REPLACE PROCEDURE add_new_order (order_id_in IN NUMBER, sales_in IN NUMBER) IS no_sales EXCEPTION; BEGIN IF sales_in = 0 THEN RAISE no_sales; ELSE INSERT INTO orders (order_id, total_sales ) VALUES ( order_id_in, sales_in ); END IF; EXCEPTION WHEN no_sales THEN raise_application_error (-20001,'У вас должны быть продажи по заказу, для закрытия заказа.'); WHEN OTHERS THEN raise_application_error (-20002,'Произошла ошибка при добавлении заказа.'); END; |
В этом примере объявили исключительную ситуацию no_sales объявленную следующим кодом:
Вызываем исключение в выполняемой части кода:
RAISE no_sales;
Теперь, если переменная sales_in содержит нуль, то наш выполнение кода перейдет к исключительной ситуации no_sales.
Наконец, мы указываем нашей процедуре, что делать, когда исключительная ситуация no_sales включается в оператор WHEN:
raise_application_error (-20001,'У вас должны быть продажи по заказу, для закрытия заказа.');
Мы также используем оператор WHEN OTHERS для перехвата всех остальных исключений:
raise_application_error (-20002,'Произошла ошибка при добавлении заказа.');