Führen Sie das Oracle SQL-Skript aus und beenden Sie sqlplus.exe über die Eingabeaufforderung

114

Ich möchte ein Oracle-Skript über SQL Plus über eine Windows-Eingabeaufforderung ausführen. Das Skript enthält keinen "exit" -Befehl, aber ich möchte trotzdem, dass SQL Plus beendet wird und die Steuerung nach Abschluss des Skripts wieder an die Eingabeaufforderung zurückgegeben wird. Mein Ziel ist es, dies zu tun, ohne das Skript zu ändern. Ist das möglich?

JoshL
quelle
Führen Sie dies mit "sqlplus .... <scriptname" oder "sqlplus ... @scriptname" aus? Ich finde unterschiedliche Verhaltensweisen, je nachdem, welches Sie unter Unix ausführen.
Runrig

Antworten:

140

Eine andere Möglichkeit besteht darin, diesen Befehl in der Batch-Datei zu verwenden:

echo exit | sqlplus user/pass@connect @scriptname
Dave Costa
quelle
1
Cool! Wissen Sie, wie der "Exit" an die sqlplus-Sitzung angehängt wird?
6
Der Befehl sqlplus führt das Skript aus und versucht dann, weitere Befehle aus der Standardeingabe zu lesen. Bei dieser Pipeline liest das Lesen von der Standardeingabe die Zeichenfolge "exit" aus dem Echo-Befehl, wodurch sqlplus beendet wird.
Dave Costa
Hervorragend - genau das habe ich gesucht. Vielen Dank!
JoshL
4
Beachten Sie, dass Sie Ihr Passwort für den Benutzernamen in der Prozessliste unter Unix (ps -ef) offenlegen, aber ich bin mir fast sicher, dass es unter Windows genauso funktioniert
Robert Merkwürdigeliebe
3
stackoverflow.com/questions/1639704/… und dba.stackexchange.com/a/65064/16892 beschreiben einige Möglichkeiten, wie kein Kennwort in der Befehlszeile verwendet werden muss ...
rogerdpack 18.02.15
13

Ich fand das die beste Lösung und es funktioniert in einem Terminal oder innerhalb eines Skripts:

echo @scriptname | sqlplus username/password@connect
user142847
quelle
1
Während dies die Frage technisch beantworten mag, ist es im Wesentlichen ein Duplikat von anderen Antworten und fügt wenig Wert hinzu. Es würde auch anderen helfen, wenn Sie erklären, was diese Befehle tun. Danke!
Chris S
5
Das hat bei mir geklappt und ich finde es eleganter als die Top-Antwort, weil es das "Verlassen" vermeidet.
Bogdan Calmac
12

Wenn Sie jetzt feststellen, dass Ihr Problem möglicherweise mit der SQL-Datei selbst zusammenhängt, müssen Sie feststellen, dass sqlplus zum Beenden aufgefordert werden muss. So mache ich das:

Wählen Sie * aus Dual;

Verlassen;
/

(Der Schrägstrich ist wichtig. Er weist sqlplus an, die darüber liegenden Statemets auszuführen.)

Chris Noe
quelle
Beachten Sie, dass die Antwort von Dave Costa auch funktioniert: Verlassen (oder Beenden) des Befehls sqlplus.
Danke für den / trick, ich habe nach diesen Informationen gesucht!
2
Der Schrägstrich bedeutet, dass ausgeführt wird, was sich im SQL-Puffer befindet. Es werden nicht mehrere Anweisungen ausgeführt, und es ist nicht erforderlich, SQLPlus-Steuerbefehle wie "quit" auszuführen. Wenn Sie an einer interaktiven SQLPlus-Eingabeaufforderung "quit" <Enter> eingeben, wird das Programm sofort beendet.
Dave Costa
12

Der beste Weg, um Benutzerinformationen zu verbergen und zu beenden, ist:

exit | sqlplus -S user/pwd@server @script.sql

exitwird an die Ausgabe von sqlplus übergeben und muss beendet werden. -SUnterdrückt alle Serverausgaben, außer SQL-Abfragen im Skript.

girish
quelle
2
Wenn Sie ssh verwenden, beenden Sie | statt Ausfahrt | Damit wird Ihre SSH-Sitzung nicht geschlossen, wenn die Datei später bearbeitet wird, um zu beenden oder zu beenden. Dies funktioniert auch, wenn die Datei nicht gefunden wird.
Karl Henselin
6

Sie können dies auch in Ihrem Shell-Skript tun.

sqlplus /nolog <<EOF
connect user/pass
@run_some_file.sql
select * from dual;
EOF

Möglicherweise müssen Sie dem ";" mit einem \.

Ethan Post
quelle
3

Ja, es ist möglich - generieren Sie ein Wrapper-Skript, das SQLPlus entsprechend einrichtet, Ihr Skript (d. H.) Enthält @YourTargetScript.sqlund dann einen Exit ausführt .

Trotzdem empfehle ich diesen Ansatz überhaupt nicht - SQLPlus verfügt über sehr viele Fallstricke für die programmatische Verwendung. Beim Schreiben von Shell-Skripten in der Vergangenheit, die Oracle verwendeten, habe ich einen Python-Wrapper darum herum erstellt (der ein vernünftigeres Verhalten bei der Fehlerbehandlung, eine gesunde Trennung der Ausgabe zwischen stdout / stderr, native CSV-Ausgabeunterstützung und andere solche Extras hinzufügte), und das hat funktioniert viel besser.

Charles Duffy
quelle
Mit jedem anderen Programm würde ich Ihnen zustimmen. ABER ich fand, dass SQLPlus mir nützlichen Kontext bei einer schlechten Abfrage gab, die andere Umgebungen (in meinem Fall Perl / DBI / DBD :: Oracle) nicht taten. Wenn Sie sorgfältige Fehlerbehandlung durchführen, kann das den Schmerz wert sein.
Abhängig davon, wie viel Kontrolle Sie über den Server haben, können Sie möglicherweise auch nicht davon ausgehen, dass mehr als Shell und SQLPlus verfügbar sind. Viele anspruchsvollere Unix-Shops, die unter Solaris, HP / UX, AIX usw. laufen, verwenden sehr einfache Installationen und lassen Sie sonst nichts auf der Box installieren. Beachten Sie, dass eine Problemumgehung manchmal nur darin besteht, einen minimalen Interpreter mit Ihrer Anwendung zu bündeln.
ConcernedOfTunbridgeWells
3

So was:

sqlplus / nolog userid / password @ tnsname @filename

Wenn Sie dies in eine Batch-Datei einfügen, fährt die Steuerung mit den darauf folgenden Anweisungen fort.

EDIT: Meine schlechte, versuchen Sie es erneut mit / nolog flag

Chris Noe
quelle
Das funktioniert leider nicht. Wenn ich die Batch-Datei ausführe, wartet SqlPlus an der SQL> -Aufforderung auf Benutzereingaben, anstatt die Steuerung an die Eingabeaufforderung zurückzugeben.
JoshL
Entschuldigung, das funktioniert auch nicht. Mit / nolog kann sqlplus gestartet werden, ohne sich anzumelden. Es hat nichts mit dem Beenden eines Skripts zu tun, wenn es abgeschlossen ist.
JoshL
Hmm, ich fange an, mich über Umgebungsunterschiede zu wundern. Ich habe zahlreiche Fledermaus-Skripte, die sqlplus auf diese Weise verwenden.
Chris, könntest du ein funktionierendes Beispiel geben? Nur etwas Einfaches, das ein "select * from dual" ausführt oder so ... Ich habe Beispiele erstellt, um Ihre Vorschläge auszuprobieren, ohne Erfolg. Denken Sie daran, dass dies unter Windows ist.
JoshL
Josh, siehe neue Antwort unten.
1

Für diejenigen, die sich Sorgen über die Sicherheit machen, Ihr Kennwort in das Skript aufzunehmen, bietet AskTom einen Artikel über "extern identifiziert" an : http: //asktom.oracle.com/pls/apex/f? P = 100: 11: 0 :::: P11_QUESTION_ID: 142212348066

user128494
quelle
2
Während dies theoretisch die Frage beantworten mag, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
Scott Pack
0

Fügen Sie in Ihrem SQL-Skript EXIT hinzu. Hier ist ein Beispiel für meine test.bat-Datei:

sqlplus user / pwd @ server @ test.SQL> myLOG.LOG

Meine test.sql-Datei hat Folgendes: select * from dual; Ausfahrt


quelle
Das ist in Ordnung, erfüllt aber nicht die Anforderung, dies zu tun, ohne das Skript so zu ändern, dass es eine exit / quit-Anweisung enthält. Die Absicht ist, dass diese Skripte von einem DBA aus SQL Plus ausgeführt werden können, aber auch aus einer Batch-Datei.
JoshL
0

Ausfahrt | SQLPLUS / @ @

Dies ist die richtige Lösung, ich habe versucht, es funktioniert


quelle