2017-05-29 2 views
0

Ich versuche, Oracle-Datenbank auf einem Server gehostet zu verbinden hier ist mein SkriptWarum funktioniert diese sqlplus-Verbindungszeichenfolge nicht in bash?

#!/bin/bash 

RAW=`cat sqlTemp.sql` 
IFS=";" 
exit=" exit;" 
for var in $RAW 
do 
query=$(echo $var | sed '/^$/d') 

sqlplus64 username/[email protected]:portnumber/servicename $query 2>> errorLog.txt 
ERRORCODE=$? 

if [ $ERRORCODE != 0 ] 
then 
    echo "$ERRORCODE" >> "errorLog.txt" 
     echo "this query has error- check the log file for detail" 
else 
    echo "SUCCESS"  
fi 
done 

Wenn i-Verbindungszeichenfolge ersetzen durch

sqlplus64 -S username/[email protected]:portnumber/servicename <<ENDOFSQL 
whenever sqlerror exit sql.sqlcode; 
$query 
exit; 
ENDOFSQL 

das Skript zu arbeiten.

Was ist falsch mit der vorherigen Verbindungszeichenfolge und wie wird es korrigiert?

+0

Was bedeutet die Option '-S' für sqlplus64? – choroba

+0

@choroba -S hilft bei der Sperrung (Stille) der Verbindungsdetails. – realName

Antwort

0

Es gibt keinen Unterschied in der Verbindungszeichenfolge "Benutzername/pwd @ Hostname: Portnummer/Servicename" in Ihren beiden Befehlen. Der Unterschied besteht darin, wie Sie versuchen, die SQL-Befehle, die Sie ausgeführt haben möchten, zu präsentieren. Es gibt mindestens zwei wichtige Unterschiede zwischen dem fehlgeschlagenen Befehl und dem, der funktioniert.

  • Die eine, die eine hier Dokument arbeitet verwendet mehrere Zeilen von Eingabe zu umleiten, einschließlich Ihrer „Abfrage“ string, in der Standard-Eingabe des Befehls, während derjenige, der die Query-String unter den Befehlszeilenargumente nicht erweitert, Das ist eine ganz andere Sache.

  • Wenn die Query-String-unquoted präsentiert wird es auf der Kommandozeile Wörter aufgespalten ist, nachdem es erweitert wird, aber das gleiche gilt nicht, wenn es in einem hier erscheint dokumentieren

Höchstwahrscheinlich Der Befehl sqlplus64 erwartet, dass seine SQL-Eingabe auf der Standardeingabe dargestellt wird, die Sie bereits kennen. Wenn es bereit wäre, SQL in der Befehlszeile zu akzeptieren, müsste es zumindest in Anführungszeichen gesetzt werden, und es würde wahrscheinlich eine Befehlszeilenoption geben, die es anweist, dort nach SQL zu suchen.

+0

können Sie sagen, was ich in der ersten Verbindungszeichenfolge selbst nicht tun kann? der zweite gibt nicht zurück sql.sqlerrm – realName

+0

@realName, mein Punkt ist, dass, was Sie in Ihrem ersten Beispiel nicht tun können, ist wahrscheinlich, es wie Ihr zweites Beispiel zu machen. Das heißt, ich denke (aber weiß nicht absolut), dass "sqlplus64" seinen SQL-Eingang von seinem 'stdin' lesen will, nicht von der Befehlszeile. Ihre zweite Alternative bringt das auf; dein erster nicht. –

+0

@realName, um zu wiederholen, was ich bereits in meiner Antwort sagte, ein "Here-Dokument" wie das zweite Beispiel verwendet Feed-Daten zur Standardeingabe des Befehls - es ist ein * Umleitung * -Operator. Das ist völlig anders, als dieselben Daten zu einem Befehlszeilenargument zu machen, wie Ihr erstes Beispiel versucht. –