Frage Führen Sie das Oracle SQL-Skript aus und beenden Sie es über die Befehlszeile von sqlplus.exe


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 Kontrolle an die Eingabeaufforderung zurückgeben, wenn das Skript beendet ist. Mein Ziel ist es, dies zu tun ohne Ändern des Skripts Ist das möglich?


101
2017-09-22 23:33


Ursprung


Führen Sie das mit "sqlplus .... <scriptname" oder "sqlplus ... @scriptname" aus ?? Ich finde unterschiedliche Verhaltensweisen, je nachdem, was man unter Unix macht. - runrig


Antworten:


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

echo exit | sqlplus user/pass@connect @scriptname

128
2017-09-23 12:28



Cool! Weißt du, wie der "Exit" an die sqlplus-Session angehängt wird?
Der sqlplus-Befehl führt das Skript aus und versucht dann, weitere Befehle von der Standardeingabe zu lesen. Bei dieser Pipeline liest das Lesen aus der Standardeingabe die Zeichenfolge "exit" aus dem Befehl echo, wodurch sqlplus beendet wird. - Dave Costa
Ausgezeichnet - genau das habe ich gesucht. Vielen Dank! - JoshL
Beachten Sie, dass Sie Ihr Benutzername-Passwort über die Prozessliste unter Unix (ps -ef) offen legen, aber ich bin mir fast sicher, dass es auf Windows genauso funktioniert - Robert Merkwürdigeliebe
stackoverflow.com/questions/1639704/... und dba.stackexchange.com/a/65064/16892 Beschreiben Sie, wie Sie das Passwort in der Befehlszeile nicht verwenden müssen ... - rogerdpack


Ich fand dies die beste Lösung und es funktioniert in einem Terminal oder in einem Skript:

echo @scriptname | sqlplus username/password@connect

12
2017-10-26 12:21



Während dies die Frage technisch beantworten kann, ist es im Wesentlichen ein Duplikat von anderen Antworten und fügt wenig Wert hinzu. Außerdem würde es anderen helfen, wenn Sie erklären würden, was diese Befehle machen. Vielen Dank! - Chris S
Dies funktionierte für mich und ich finde es eleganter als die beste Antwort, weil es "Exit" vermeidet. - Bogdan Calmac


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

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

exit wird an die Ausgabe von sqlplus übergeben und zum Beenden gezwungen. -S Übertrifft alle Serverausgaben außer SQL-Abfragen im Skript.


12
2018-03-18 21:20



Wenn ssh zu verwenden ist, beenden Sie | statt Ausgang | Damit wird Ihre ssh-Sitzung nicht geschlossen, wenn die Datei später bearbeitet wird, um einen Exit zu erhalten oder zu beenden. Dies funktioniert, wenn die Datei nicht gefunden wird. - Karl Henselin


Wenn Sie jetzt feststellen, dass Ihr Problem möglicherweise mit der SQL-Datei selbst zusammenhängt, müssen Sie wissen, dass sqlplus angewiesen werden muss, das Programm zu beenden. Die Art, wie ich das mache ist:

Wählen Sie * aus zwei;

Verlassen;
/

(Der Schrägstrich ist wichtig. Er fordert sqlplus auf, die darüber liegenden Stateme auszuführen.)


11
2017-09-23 16:04



Beachten Sie, dass die Antwort von Dave Costa auch funktioniert: Exit (oder Beenden) in den Befehl sqlplus.
Danke für den / Trick, ich habe nach diesen Informationen gesucht!
Der Schrägstrich bedeutet, was im SQL-Puffer ist. Es führt nicht mehrere Anweisungen aus, und es ist nicht notwendig, SQLPlus-Steuerbefehle wie "quit" auszuführen. Wenn Sie an einer interaktiven SQLPlus-Eingabeaufforderung "quit" <Eingabe> eingeben, wird es sofort beendet. - Dave Costa


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

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

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


6
2017-09-23 12:33





So was:

sqlplus / nolog Benutzer-ID / Passwort @ tnsname @ Dateiname

Wenn Sie dies in eine Stapeldatei einfügen, wird die Steuerung mit den folgenden Anweisungen fortfahren.

EDIT: Mein Fehler, versuchen Sie es erneut mit / nolog Flagge


4
2017-09-22 23:43



Leider funktioniert das nicht. Wenn ich die Batchdatei ausführe, wartet SqlPlus an der Eingabeaufforderung SQL> auf Benutzereingaben, anstatt die Steuerung an die Eingabeaufforderung zurückzugeben. - JoshL
Tut mir leid, das funktioniert auch nicht. / nolog ermöglicht sqlplus ohne Anmeldung. Es hat nichts damit zu tun, ein Skript beim Beenden zu beenden. - JoshL
Hmm, ich fange an, mich über die Unterschiede in der Umwelt Gedanken zu machen. Ich habe zahlreiche Bat-Skripte, die sqlplus auf diese Weise verwenden.
Chris, könnten Sie ein funktionierendes Beispiel geben? Nur etwas einfaches, das ein "select * from dual" oder so etwas ausführt ... Ich habe Beispiele erstellt, um deine Vorschläge auszuprobieren, ohne Erfolg. Denken Sie daran, dass dies unter Windows geschieht. - JoshL
Josh, siehe unten neue Antwort.


Ja, es ist möglich - generieren Sie ein Wrapper-Skript, das SQLPlus entsprechend einrichtet, einschließlich Ihres Skripts (d. H. @YourTargetScript.sql), und macht dann einen Ausgang.

Das heißt, ich empfehle diesen Ansatz überhaupt nicht - SQLPlus hat eine Menge Probleme für den programmatischen Einsatz; Beim Schreiben von Shell-Skripten in der Vergangenheit, die Oracle verwendet haben, habe ich einen Python-Wrapper um ihn herum erstellt (sinnvolleres Verhalten bei der Fehlerbehandlung, saubere Trennung der Ausgabe zwischen stdout / stderr, native CSV-Ausgabeunterstützung und andere nützliche Funktionen) viel besser.


3
2017-09-22 23:40



Mit jedem anderen Programm würde ich dir zustimmen. ABER ich fand, dass SQLPlus mir nützlichen Kontext auf einer schlechten Frage 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.
Je nachdem, wie viel Kontrolle Sie über den Server haben, können Sie auch die Verfügbarkeit von etwas anderem als Shell und SQLPlus voraussetzen. Viele stolze Unix-Shops mit Solaris, HP / UX, AIX und ähnlichem verwenden sehr einfache Installationen und lassen nichts anderes auf der Box installieren. Beachten Sie, dass eine Umgehung dieses Problems manchmal darin besteht, einen minimalen Interpreter mit Ihrer Anwendung zu bündeln. - ConcernedOfTunbridgeWells


Für diejenigen, die sich Sorgen um die Sicherheit der Eingabe Ihres Passwortes in das Skript machen, hat AskTom einen Artikel über "extern identifiziert" http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:142212348066


1
2017-07-16 19:38



Während dies theoretisch die Frage beantworten könnte, es wäre vorzuziehen um die wesentlichen Teile der Antwort hier einzubeziehen und den Link als Referenz bereitzustellen. - Scott Pack


Fügen Sie in Ihrem SQL-Skript EXIT hinzu. Hier ist ein Beispiel Meine test.bat Datei hat folgendes:

sqlplus Benutzer / pwd @ Server @ test.SQL> myLOG.LOG

Meine test.sql Datei hat folgendes: Wählen Sie * aus zwei; Ausfahrt


0
2018-06-19 20:40



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


Ausgang | SQLPLUS / @ @

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


0
2017-11-20 06:57