2016-11-21 89 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? –