我正在运行Windows 10-64位和Oracle 18.4,我有一个Windows批处理文件(test1.bat(,它调用Windows SQL脚本文件。
SQLPLUS -s (username)/(password) as sysdba @test1.sql
Echo %errorlevel%
然后,当我从 SQLPLUS 返回到 Test1.bat 时,我想对 %errorlevel% 变量进行一些错误检查。我将根据返回代码是 ORA-01940(无法删除当前连接的用户(还是 ORA-01918(用户"MYUSER"不存在(等创建不同的进程。
当我运行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;
您需要在错误发生之前声明错误条件处理:
Whenever sqlerror exit sql.sqlcode;
DROP user MYUSER cascade;
EXIT 0;
您可以在脚本中的不同点更改处理。例如,您可以在创建之前执行保护性丢弃,方法是忽略丢弃上的错误,但如果下一步失败,仍会停止:
whenever sqlerror continue
drop ...
whenever sqlerror exit failure
create...
alter...
etc
顺便说一下,在Unix-land中,这种方法是有限的,因为大多数(所有?(shell的返回码有限,并且更高的数字环绕;所以ORA-0918将被报告为126,因此无法解释。更重要的是,某些值将换行为零,使其看起来像没有发生错误。幸运的是,您没有 %errorlevel% 的问题。