【问题标题】:How do I pass a return code from an Oracle script back to the WINDOWS Batch script which called it?如何将 Oracle 脚本的返回码传递回调用它的 WINDOWS Batch 脚本?
【发布时间】:2020-01-26 04:40:34
【问题描述】:

我正在运行 Windows 10-64 位和 Oracle 18.4 我有一个调用 Windows SQL 脚本文件的 Windows 批处理文件 (test1.bat)。

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 传递回调用它的批处理脚本?这是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;

【问题讨论】:

    标签: oracle batch-file sqlplus return-code


    【解决方案1】:

    需要在错误发生前声明错误条件处理:

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

    您可以在脚本的不同点更改处理。例如,您可以在创建之前进行保护性丢弃,方法是忽略丢弃错误,但如果下一步失败仍会停止:

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

    顺便说一句,在 Unix 领域,这种方法是有限的,因为大多数(所有?)shell 的返回码都是有限的,而且数字越大;因此 ORA-0918 将报告为 126,因此无法解释。更重要的是,一些值会归零,看起来好像没有发生错误。幸运的是,%errorlevel% 没有这个问题。

    【讨论】:

    • 将 WHENEVER 子句放在 DROP 之前解决了 Alex 的问题。谢谢!另外,感谢您让我知道 WHENEVER 可以多次更改。这可能会派上用场。菲尔
    猜你喜欢
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2013-11-02
    • 1970-01-01
    相关资源
    最近更新 更多