2016-11-21 2 views
0

Ich möchte jede SQL-Fehler fangen, die so passieren könnte ich schrieb dies im KSH:Wie sqlplus beenden, wenn ein Fehler passiert

$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 

ich für die alte Tabelle, die einen falschen Namen zu sehen, setzen, was passiert. Ich erwarte, dass nur die sqlcode haben, wie ich frage in WHEN SQLERROR aber ich habe dies:

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

ich den Code geändert:

$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" 

Obwohl es ein Fehler ist, der Code gleich 0 Wo ist der sql Fehlercode?


In der Tat, keine Verwendung von begin ... end und es funktioniert

Antwort

0

Ich bin nicht sicher, was Sie tun, aber diese Art von Code funktioniert gut für mich. Für Ihr erstes Beispiel:

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 

Beachten Sie, dass der Exit-Code nicht exakt den SQLCODE entspricht, weil der SQLCODE immer negativ ist, während der Exit-Code in den meisten Schalen auf Werte von 0 bis 255 begrenzt ist; Daher scheint es, dass Sie als Exit-Code das niederwertige Byte des Zweierkomplements von SQLCODE (+) erhalten. In der Praxis bedeutet dies, dass Sie einen Wert ungleich Null erhalten, der vorhersehbar und wiederholbar ist, aber nicht genau mit dem SQLCODE übereinstimmt und mehrere SQLCODE-Werte denselben Exit-Code-Wert ergeben können.

Viel Glück.

(+) Wenn Sie sich interessieren: Im obigen Beispiel ist der SQLCODE -904. Im Hexadezimalformat ist dies 0xFFFFFC52. Wenn Sie alle Bits dieser Zahl invertieren, erhalten Sie das Einser-Komplement, das 0x3AD ist. Wenn Sie diesem Wert einen Wert hinzufügen, erhalten Sie den Zweierkomplementwert 0x3AE. Das niederwertige Byte davon ist 0xAE, was in Basis 10 174 ist. Ich habe dies für SQLCODE-Werte von -904 wiederholt, was einen Exit-Code von 136 und -6550 ergibt, was einen Exit-Code von 150 ergibt.

+0

Welches Betriebssystem und welche Shell verwenden Sie? –