oracle - 发生错误时如何退出sqlplus

标签 oracle error-handling sqlplus

我想捕捉任何可能发生的 sql 错误,所以我在 ksh 中写了这个:

$ORACLE_HOME/bin/sqlplus -s u/p <<EOF
    WHENEVER OSERROR EXIT 68;
    WHENEVER SQLERROR EXIT SQL.SQLCODE;

    CREATE TABLE new_table
    AS (SELECT * FROM wrong_old_table);
    COMMIT;
EOF

我为旧表输入了错误的名称,看看会发生什么。我希望只像我在 WHENEVER SQLERROR 中询问的那样拥有 sqlcode,但我有这个:

 AS (SELECT * FROM wrong_old_table)
                      *
 ERROR at line 2:
 ORA-00942: table or view does not exist

我改了代码:

 $ORACLE_HOME/bin/sqlplus -s u/p <<EOF
    WHENEVER OSERROR EXIT 68;
    WHENEVER SQLERROR EXIT SQL.SQLCODE;

    BEGIN
       CREATE TABLE new_table
       AS (SELECT * FROM wrong_old_table);
       COMMIT;
    END;
 EOF

 sql_code=$?

 echo "code=$sql_code"

即使有错误,code也等于0。sql错误码在哪里?


事实上,没有使用 begin...end 并且它有效

最佳答案

我不确定你在做什么,但这种类型的代码对我来说很好用。对于您的第一个示例:

SQL> whenever sqlerror exit sql.sqlcode;
SQL> create table new_table as select * from wrong_old_table;
create table new_table as select * from wrong_old_table
                                        *
ERROR at line 1:
ORA-00942: table or view does not exist

$ echo $?
174

请注意,退出代码与 SQLCODE 并不完全对应,因为 SQLCODE 始终为负数,而大多数 shell 中的退出代码仅限于从 +0 到 +255 的值;因此,您得到的退出代码似乎是 SQLCODE (+) 的二进制补码的低位字节。实际上,这意味着您会得到一个可预测和可重复的非零值,但它不会与 SQLCODE 完全匹配,并且多个 SQLCODE 值可能会产生相同的退出代码值。

祝你好运。

(+) 如果您关心的话:在上面的示例中,SQLCODE 是 -942。在十六进制中,这是 0xFFFFFC52。将这个数字的所有位取反,得到一个补码,即 0x3AD。向该值加一会得到二进制补码值,即 0x3AE。它的低位字节是 0xAE,它以 10 为底数为 174。我已经对 -904 的 SQLCODE 值重复了这个,它给出的退出代码是 136,而 -6550 给出的退出代码是 150。

关于oracle - 发生错误时如何退出sqlplus,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40718791/

相关文章:

oracle - 如何使用pl/sql developer自动生成数据库图或ER图?

java - 我需要帮助找出我的代码出了什么问题

bash - 权限在查找 : why do we need 2>&1? 中被拒绝

oracle11g - scott 帐户被锁定在 SQL Plus 中

linux - 登录到 sqlplus 为什么它总是打印用户名?

mysql - 将 Oracle SQL 重写为 MYsql

oracle - 如何在oracle中选择昨天特定时间到今天特定时间之间的数据

javascript - Apex Oracle 在 Internet Explorer 上打印

PHP 错误类的对象无法转换为字符串

linux - linux上的sqlplus查询+循环