错误发生时如何退出sqlplus

时间:2016-11-21 11:14:30

标签: 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"

即使出现错误,代码也等于0. sql错误代码在哪里?

事实上,没有使用开始...结束它的工作

1 个答案:

答案 0 :(得分:4)

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

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.我重复了这个,SQLCODE值为-904,退出代码为136,-6550,退出代码为150。 / p>