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

Я использую Windows 10-64 бит и 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' не существует), et c.

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

>Echo 0
0

Как передать код ошибки из Oracle SQLPLUS обратно в пакетный сценарий, который его вызвал? Вот тест1. 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;

1 Ответ

1 голос
/ 25 января 2020

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

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

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

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

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

...