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
(Мне эта ошибка дорогого стоила.)