2016-11-21 86 views
0

我想赶可能发生,所以我在KSH写这篇任何SQL错误退出sqlplus中:如何当错误发生

$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错误代码?


事实上,没有用的......开始结束和它的作品

回答

0

我不知道你在做什么,但这种类型的代码工作正常,我。为了您的第一个例子:

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始终是负值,而在大多数shell退出代码仅限于从值+ 0 +255退出代码不完全对应于SQLCODE;因此,看起来您作为退出代码得到的是SQLCODE(+)的二进制补码的低位字节。实际上,这意味着您会得到一个非零值,这是可预测和可重复的,但不会完全匹配SQLCODE,并且多个SQLCODE值可能会产生相同的退出代码值。

祝你好运。

(+)如果你在意:在上面的例子中,SQLCODE是-904。在十六进制中,这是0xFFFFFC52。将这个数字的所有位反转,就可以得到补码,即0x3AD。给这个值加1就会得到二进制补码值,即0x3AE。它的低位字节是0xAE,它是基数为10的174。我重复了这一步,得到-904的SQLCODE值,它给出了136的退出代码和-6550,它给出了退出代码150.

+0

你在使用什么操作系统和shell? –