2016-07-29 52 views
0

Ich bin neu in Shell-Skript. Ich schreibe einen Code für DBA-Automatisierung, in dem ich master.sql-Datei haben Deklarationen von n Anzahl von SQL. und diese sqls werden in bestimmten Ordner platziert. ich habe ein Skript, das diese Master.sql anruft und diese sqls auf einmal indirekt und Speichern in der ProtokolldateiWie sqlplus Befehl in Unix-Shell-Skript zu stoppen, wenn sql fehlschlägt

sqlplus Befehl die Ausgabe aller sqls innerhalb Master.sql erklärte einmal bei wwhat ich will Ausführung spart ist es muss die Ausführung stoppen, wenn der erste sql fehlschlägt und den Fehler mit dem spezifischen sql zurückgeben, der fehlgeschlagen ist oder nach Rollback fragen und fragen, wollen Sie fortfahren oder nicht? versucht mit sqlplus wann immer ,, sqlerror, $? nichts funktionierte

sqlplus ${USER}/${PASS}@$SID @master.sql > /home/deploy/vidya/properties/result/result.log 

Nun, was ich versuche zu tun .... Ich mag die Ausführung von sqls zu stoppen, wenn eine der SQL vom Startfehlschlägt und fordert auf der Kommandozeile mit dem Fehler und geben Sie die sQL nicht

Master.sql

SET ECHO ON 

@/home/deploy/vidya/properties/001_dba_demo.sql 
@/home/deploy/vidya/properties/003_dba_demo1.sql 
@/home/deploy/vidya/properties/002_dba_demo2.sql 
@/home/deploy/vidya/properties/004_dba_demo2.sql 

EXIT 

mein .sh-Skript, das Master.sql Aufruf wird und seine Arbeit richtig

#!/bin/bash 

echo "Enter schema Name you want to connect: " 
read USER 
echo "Enter password: " 
read -s PASS 
#echo "Enter Oracle SID for the environment you want to connect with : " 
#read SID 
echo "Enter Environment for the environment you want to connect with : " 
read ENV 
echo "Enter Oracle SID for the environment you want to connect with : " 
read SID 

export ORACLE_SID=${SID} 

if [ $ENV == UAT ] 
then 
    echo "Connected withh UAT ORACLE HOME:" 
export ORACLE_HOME=/u01/app/oracle/product/11.2.0.4/db_1 
elif [ $ENV == PROD ] 
then 
echo "Connected with PROD ORACLE HOME:" 
export ORACLE_HOME=/u01/app/oracle/product/11.2.0.4/db_1 

else 
echo "Wrong Environment Entered :" 

fi 
export PATH=$ORACLE_HOME/bin:$PATH 

echo "want to execute sql? y/n" 
read yn 

sqlplus ${USER}/${PASS}@$SID @master.sql > /home/deploy/vidya/properties/result/result.log 

**

kann jemand helfen **

+1

[WHEN SQLERROR] (https://docs.oracle.com/cd/B19306_01/server.102/b14357/ch12052.htm)? – 7171u

Antwort

0

One ideea die SQLs in Folge zu starten wäre und überprüfen Sie sie danach auf Fehler: z.B.

Der exit 0 Teil, beendet das gesamte Skript, wenn grep einen Fehler in der Protokolldatei findet.

+0

Wenn Sie nicht zu viele IFS in das Skript schreiben möchten, können Sie das Ganze in ein for: z. für f in 'ls -1/some_location/folder_with_sqls'; mach the_if_part_above; erledigt. Sie können den f in 'for f in ...' als Variable zum Starten bestimmter Skripte verwenden: sqlplus $ {USER}/$ {PASS} @ $ SID @ $ f und Ausgabe in bestimmte Log-Dateien speichern:>/home/deploy/vidya/properties/result/result_ $ f.log, und Ändern der Checker-Variablen $ (grep "ERROR" result_ $ f.log –

+0

Ein SQL-Fehler sollte wahrscheinlich als Fehler behandelt werden.Drucken Sie die Fehlermeldung in stderr und beenden Sie mit einem Wert ungleich Null: '... else; echo "dba_demo_SQL fehlgeschlagen"> & 2; Ausgang 1; ' –

+0

Stimmen Sie mit William überein, besser, Ausgang 1 zu verwenden –

0

ich denke sqlplus hat die Hauptfunktion, um die sqls sofort auszuführen und in der Protokolldatei zu speichern. es macht es schon. Was ich will, ist jeden SQL einzeln auszuführen und wenn sql fehlschlägt dann sollte es die Ausführung stoppen und geben Sie den Fehler in der Befehlszeile

0

Sorry für die Verwendung von Kommentaren. Habe nicht genug Ansehen. Das ist meine Lösung in der ersten Antwort. Anstatt die master.sql über sqlplus zu starten, starten Sie die kleineren sql nacheinander und überprüfen Sie die Protokolldatei nach jeder Ausführung. Wenn die Protokolldatei für die SQL-Nummer 1 Fehler enthält, wird mit dem Exit 1 in der if-Klausel das gesamte Skript beendet.

#First query 
    #Sqlplus command to run the first query 
    sqlplus ${USER}/${PASS}@$SID @dba_demo.sql > /home/deploy/vidya/properties/result/result_dba_demoSQL.log 
    #variable checker is assigned ERROR, if ERROR is found in file (you have to check what errors you can get from oracle) 
    checker = $(grep "ERROR" result_dba_demoSQL.log) 
    #If clause that checks if variable checker is empty or not, if variable checker is empty, it means that no string "ERROR" was found in log files, thus script continues to run; If variable is not empty (string ERROR was chatched) script terminates. 
    if [ test -z $checker ] 
     then echo "dba_demo_SQL successfull run" 
     else 
      echo "dba_demo_SQL failed" 
      exit 1 
    fi 
    # Second Query 
    sqlplus ${USER}/${PASS}@$SID @dba_demo1.sql > /home/deploy/vidya/properties/result/result_dba_demo1SQL.log 
    checker = $(grep "ERROR" result_dba_demo1SQL.log) 
    if [ test -z $checker ] 
     then echo "dba_demo1_SQL successfull run" 
     else 
      echo "dba_demo1_SQL failed" 
      exit 1 
    fi 
+0

Dies ist die gute Lösung, aber die Sache ist, ich mache dba Automatisierung und tun dies für den Client so es ist ihre Anforderung. sie senden uns die master.sql-datei deklaration aller sqls. also müssen wir es ausführen. . Kannst du nur helfen, diese Methode zu benutzen? –

0

Wenn Ihr Master.sql das gleiche wie das Beispiel ist Sie auf dem Laufenden, eine Liste von Pfaden, um SQL-Dateien selbst bedeutet, können Sie dies tun:

# Read the master.sql file, for every line in master.sql file 
    for i in `cat master.sql`; do 
    # basename "$i" takes the name of the file from path present in master.sql 
    sql_name = $(basename "$i") 
    # use path in the sqlplus command ($i from the for loop) and sqlname for the log file name 
    sqlplus ${USER}/${PASS}@$SID @$i > /home/deploy/vidya/properties/result/result_$sql_name.log 
checker = $(grep "ERROR" result_$sql_name.log) 
if [ test -z $checker ] 
    then echo "$sql_name successfull run" 
    else 
     echo "$sql_name failed" 
     exit 1 
fi ; done 
+0

Fehler: ./run-sqlplus2.sh: Zeile 96: =: Befehl nicht gefunden Exit grep: .log: Keine solche Datei oder Verzeichnis ./run-sqlplus2.sh: Zeile 99: Checker: Befehl nicht gefunden ./run-sqlplus2.sh: Zeile 100: [: test: unärer Operator erwartet fehlgeschlagen –