WHENEVER

Whenever — всякий раз.

Не всякий раз, как оказалось. Очень простая задача, ловить все ошибки (что их можно было обрабатывать) в pl/sql скрипте, и потом в bat файле обрабатывать. Пробуем:

1 WHENEVER SQLERROR EXIT SQL.SQLCODE ROLLBACK; 2 3 DECLARE 4 a NUMBER(23,4); 5 BEGIN 6 a := 1/0; 7 END; 8 / 9 EXIT 10 /

sqlplus -S user/pwd@server @test.sql

@echo %ERRORLEVEL%

Получаем «красивый» результат:

DECLARE

*

ERROR at line 1:

ORA-01476: divisor is equal to zero

ORA-06512: at line 5

1476

Замечательно. Теперь еще надо это записать (для потомков).

1 WHENEVER SQLERROR EXIT SQL.SQLCODE; 2 3 DECLARE 4 a NUMBER(23,4); 5 BEGIN 6 a := 1/0; 7 EXCEPTION 8 WHEN OTHERS THEN 9 dbms_output.put_line('error'); 10 END; 11 / 12 EXIT 13 /
Запускаем опять:
sqlplus -S user/pwd@server @test.sql@echo %ERRORLEVEL%
 

PL/SQL procedure successfully completed.

0

Не совсем то что я ожидал. Что бы sqlplus все-таки вернул ошибку — его надо об этом попросить — добавить raise.

1 WHENEVER SQLERROR EXIT SQL.SQLCODE; 2 3 DECLARE 4 a NUMBER(23,4); 5 BEGIN 6 a := 1/0; 7 EXCEPTION 8 WHEN OTHERS THEN 9 dbms_output.put_line('write something'); 10 RAISE; 11 END; 12 / 13 EXIT 14 /

Теперь ошибка возвращается.

DECLARE

*

ERROR at line 1:

ORA-01476: divisor is equal to zero

ORA-06512: at line 11

1476

(Мне эта ошибка дорогого стоила.)

Tags: , ,

Смотрите также: