2013-02-06 5 views
12
#!/bin/sh 

echo "Please enter evaluate database username" 
read eval_user 
echo "Please enter evaluate database password" 
read eval_pass 
echo "Please enter the database name" 
read db_name 

LOGFILE=shell_log.txt 

$ORACLE_HOME/bin/sqlplus -s /nolog <<-EOF>> ${LOGFILE} 
connect $eval_user/[email protected]$db_name 
WHENEVER OSERROR EXIT 9; 
WHENEVER SQLERROR EXIT SQL.SQLCODE; 
DBMS_OUTPUT.put_line('Connected to db'); 
EOF 

if [ $? != 0 ] 
then 
echo "The upgrade script failed. Please refer to the log results.txt for more information" 
echo "Error code $?" 
exit 0; 
fi 

Ich gebe Garbage-Werte ein, die versuchen, dieses Skript zum Fehlschlagen zu zwingen. Aber, ärgerlich, es geht weiter voran, ohne irgendeinen Fehlercode zu erwähnen. Was muss hier noch getan werden?Verwalten der Fehlerbehandlung beim Ausführen von sqlplus aus Shellskripts

+0

Unter welchem ​​OS-Benutzerkonto laufen Sie? In welcher Datenbank meldet sich das Skript an? – APC

+0

Ich habe Ihr Skript ausprobiert, und die Protokolldatei erfasst den Fehlercode. Hier ist der Zugriff aus der Protokolldatei: 'ERROR: ORA-01017: ungültiger Benutzername/Passwort; Anmeldung verweigert SP2-0734: unbekannter Befehl beginnt "DBMS_OUTPU ..." - Rest der Zeile ignoriert. – Incognito

+0

Darf ich wissen, was erhalten Sie in der Protokolldatei, wenn Sie das Skript ausführen? – Incognito

Antwort

11

Was Max sagt, ist richtig. Versuchen Sie dieses modifizierte Skript

#!/bin/sh 

echo "Please enter evaluate database username" 
read eval_user 
echo "Please enter evaluate database password" 
read eval_pass 
echo "Please enter the database name" 
read db_name 

LOGFILE=shell_log.txt 

sqlplus -s /nolog <<-EOF>> ${LOGFILE} 
WHENEVER OSERROR EXIT 9; 
WHENEVER SQLERROR EXIT SQL.SQLCODE; 
connect $eval_user/[email protected]$db_name 
DBMS_OUTPUT.put_line('Connected to db'); 
EOF 

sql_return_code=$? 

if [ $sql_return_code != 0 ] 
then 
echo "The upgrade script failed. Please refer to the log results.txt for more information" 
echo "Error code $sql_return_code" 
exit 0; 
fi 

Bitte beachten Sie die Verwendung von sql_return_code, um den SQLPLUS-Returncode zu erfassen.

Die DBMS_OUTPUT-Anweisung sollte mit Fehler fehlschlagen - "SP2-0734: unbekannter Befehl beginnt ...". Sie finden die Fehlermeldung in der Protokolldatei.

Es ist möglich, die sp2-Fehler in SQLPLUS 11g mithilfe der Fehlerprotokollierungsfunktion abzufangen. Bitte sehen Sie sich http://tkyte.blogspot.co.uk/2010/04/new-thing-about-sqlplus.html für weitere Informationen an.

+0

Ich bekomme nur Fehlercode 122, anstelle der tatsächlichen db Fehlermeldung. Kennen Sie eine Möglichkeit, die Ausgabe zu erfassen? – roymustang86

+0

Die Fehlermeldung wird an "shell_log.txt" umgeleitet. Sehen Sie sich diese Datei in Ihrem aktuellen Verzeichnis an. Wenn Sie die Ausgabe im Shell-Skript erfassen möchten, müssen Sie die Umleitung entfernen und die Ausgabe von SQLPLUS einer Variablen zuweisen. ZB: - 'SQL_RESULT = $ (sqlplus -s/nolog << EOF WENN IMMER SQLERROR EXIT FEHLER WÄHREND OSERROR EXIT FEHLER SET SERVEROUTPUT ON connect $ eval_user/$ eval_pass @ $ db_name exec DBMS_OUTPUT.put_line ('Verbunden mit db'); beenden EOF) ' –

+2

Shell-Skript in einem UNIX-Betriebssystem kann Codes bis zu 255 zurückgeben. So verstehe ich nicht, wie WHENEVER SQLERROR EXIT SQL.SQLCODE; kann korrekt SQL-Codes über 255 zurückgeben? Zum Beispiel ORA-12703 diese Zeichensatzkonvertierung wird nicht unterstützt Eigentlich habe ich gerade einen Test und lief ein schlechtes SQL, das mit fehlschlägt ORA-00936: fehlende Ausdruck schlechte sqlplus zurückgegeben 168 (!) So wurde der tatsächliche Return-Code 936 gewickelt und nur der Rest wurde zurückgegeben. 936% 256 = 168. Dies ist keine korrekte Antwort. – Tagar

5

Es ist möglich, dass Ihre when-Anweisungen ausgeführt werden, nachdem die Verbindung zur Datenbank hergestellt wurde (da Sie sie später erwähnt haben). Probieren Sie folgenden Code: -

$ORACLE_HOME/bin/sqlplus -s /nolog <<-EOF>> ${LOGFILE} 
WHENEVER OSERROR EXIT 9; 
WHENEVER SQLERROR EXIT SQL.SQLCODE; 
connect $eval_user/[email protected]$db_name 
DBMS_OUTPUT.put_line('Connected to db'); 
EOF 
1

Die Tatsache, dass Sie falsche Werte eingeben, sind wahrscheinlich nur mit dem Login verbunden. Dann: Check database connectivity using Shell script

Die WHENEVER ... sind für Fehler während der SQL-Skriptausführung. Sobald Sie erfolgreich mit Ihrem Skript verbinden (ich nehme an, dass Ihr Problem gerade jetzt), sollten Sie die Art von Fehler von WHENEVER ERROR verwaltet, weil Sie die EXEC an Ihrer Leitung mit DBMS_OUTPUT vergessen haben.

0

Sie können nur SQL-Fehler oder os Fehler abfangen. Der dbms_output wird auf sqlplus-Ebene selbst fehlschlagen, so dass die Einstellung für jedes Mal keine Auswirkungen hat.

3

Aji Antwort mit

WHENEVER SQLERROR EXIT SQL.SQLCODE; 

und dann mit

sql_return_code=$? 

nicht korrekt ist (oder nicht richtig in den meisten Fällen). Siehe Details unten.


Shell-Skript in einem UNIX O Returncodes kann bis zu 255 Z.B. "ORA-12703 Diese Zeichensatzkonvertierung wird nicht unterstützt." Der Rückkehrcode sollte 12703 lauten, passt jedoch nicht in den 8-Bit-Rückkehrcode von UNIX.
Eigentlich habe ich gerade einen Test und lief eine schlechte SQL, die mit "ORA-00936 fehlender Ausdruck" fehlschlägt -
sqlplus zurückgegeben 168 (!).
So wurde der tatsächliche Rückkehrcode 936 bei 256 gewickelt und nur Rest wurde zurückgegeben. 936% 256 = 168.


Auf Windows könnte das wahrscheinlich funktionieren (nicht getestet), aber nicht auf UNIX (getestet wie oben erklärt).


Der einzige zuverlässige Mechanismus ist wahrscheinlich Ergebnisse in eine Protokolldatei spulen und dann wie etwas tun

tail -n 25 spool.log | egrep "ORA-" | tail -n 1 | cut -d: -f1 | cut -d- -f2 

So wäre es die Spool-Protokolldatei grep und dann tatsächlich neuesten ORA-Code schneiden.

Verwandte Themen