Как передать код возврата из сценария Oracle обратно в сценарий пакетной обработки WINDOWS, который его вызвал?

Я использую Windows 10-64 bit и Oracle 18.4. У меня есть командный файл Windows (test1.bat), который вызывает файл сценария Windows SQL.

SQLPLUS -s (username)/(password) as sysdba @test1.sql
Echo %errorlevel%

Затем я хотел бы выполнить некоторую проверку ошибок в переменной% errorlevel%, когда я вернусь к Test1.bat из SQLPLUS. Я создам разные процессы в зависимости от того, является ли код возврата ORA-01940 (невозможно удалить подключенного в данный момент пользователя) или ORA-01918 (пользователя MYUSER не существует) и т. Д.

Когда я запускаю test1.bat, я не могу ссылаться на код возврата из Oracle SQLPLUS, даже если пользователь был ранее удален. Пакетный скрипт генерирует

>Echo 0
0

Как я могу передать код ошибки из Oracle SQLPLUS обратно в пакетный скрипт, который его вызвал? Вот test1.sql

PROMPT Begin Dropping User Schema MyUser
Alter Session Set CONTAINER=(MyContainer);
Alter Session Set "_oracle_script"=true;
DROP user MYUSER cascade;
Whenever sqlerror exit sql.sqlcode;
EXIT;

person user3138025    schedule 25.01.2020    source источник


Ответы (1)


Вам необходимо объявить обработку условий ошибки до того, как ошибка возникнет:

Whenever sqlerror exit sql.sqlcode; 
DROP user MYUSER cascade;
EXIT 0;

Вы можете изменить обработку в другом месте скрипта. Например, вы можете выполнить защитное падение перед созданием, игнорируя ошибку при перетаскивании, но все же останавливаясь, если следующий шаг не удастся:

whenever sqlerror continue
drop ...
whenever sqlerror exit failure
create...
alter...
etc

Между прочим, в Unix-land этот подход ограничен, потому что большинство (всех?) Оболочек имеют ограниченный код возврата и более высокие числа переносятся; таким образом, ORA-0918 будет записан как 126, что делает невозможным его интерпретацию. Что еще более важно, некоторые значения будут сброшены до нуля, что создаст впечатление, что ошибки не произошло. К счастью, у вас нет этой проблемы с% errorlevel%.

person Alex Poole    schedule 25.01.2020
comment
Размещение предложения WHENEVER перед DROP решило проблему Alex. Спасибо! Кроме того, спасибо, что сообщили мне, что WHENEVER можно изменять несколько раз. Это может пригодиться. Фил - person user3138025; 25.01.2020