Если вы используете только эту функцию и зависите от результата, который она возвращает + , беспокойтесь, не выйдет ли она из строя (ну, кто сказал, что это произойдет? Может быть, это надежно), тогда хорошие новости для вас : поскольку эта функция не одна в космосе, вы можете создать функцию обертку в своей собственной схеме. Ваша функция будет вызывать «оригинал» и обрабатывать возможные исключения.
Вот простой пример, чтобы проиллюстрировать, что я имею в виду.
Подключен как mike
, я создам функцию, которая возвращает ошибку (и передаю ее scott
):
SQL> connect mike/lion
Connected.
SQL> create or replace function f_fail return number as
2 begin
3 return 1/0;
4 end;
5 /
Function created.
SQL> select f_fail from dual;
select f_fail from dual
*
ERROR at line 1:
ORA-01476: divisor is equal to zero
ORA-06512: at "MIKE.F_FAIL", line 3
SQL> grant execute on f_fail to scott;
Grant succeeded.
Подключитесь как scott
и вызовите эту функцию; конечно, это не удастся:
SQL> connect scott/tiger
Connected.
SQL> select mike.f_fail from dual;
select mike.f_fail from dual
*
ERROR at line 1:
ORA-01476: divisor is equal to zero
ORA-06512: at "MIKE.F_FAIL", line 3
Хорошо, давайте создадим функцию wrapper и посмотрим, как она себя ведет (я буду использовать when others
, который, вероятно, является худшим обработчиком исключений ; Я бы посоветовал вам использовать более разумный подход и обрабатывать исключения по мере их возникновения).
SQL> create or replace function f_wrapper return number as
2 begin
3 return mike.f_fail;
4 exception
5 when others then
6 return 0;
7 end;
8 /
Function created.
SQL> select f_wrapper from dual;
F_WRAPPER
----------
0
SQL>
Ага! Больше не нужно деление на ноль ошибка!
Посмотрим, поможет ли.