Wie beende ich ein Skript in SQLPlus, wenn ein Fehler auftritt, und kehre zur SQLPlus-Eingabeaufforderung zurück, ohne SQLPlus zu trennen oder zu beenden?

8

Ich habe einige Skripte, die oft ausgeführt werden, immer innerhalb einer verbundenen SQLPlus-Sitzung.

Ich brauche eine Möglichkeit, das Skript zu beenden, wenn ein Fehler auftritt, ohne die Verbindung zu trennen oder SQLPlus selbst zu beenden. Wenn ein Fehler auftritt, muss der verbundene DBA in 100% der Fälle einen oder mehrere Befehle in die Sitzung eingeben. 100% der Zeit, wenn ein Fehler auftritt, gibt es andere SQLPlus-Anweisungen (und somit müssen außerhalb eines BEGIN..END; sein) später im Skript, das darf nicht ausgeführt werden oder es können schwerwiegende Probleme auftreten.

HINWEIS: Wenn Sie WHENEVER SQLERROR EXIT vorschlagen, haben Sie den obigen Text nicht gelesen. Dadurch wird SQLPlus neben das Skript getrennt und beendet, was kein akzeptables Verhalten ist.

    
Thought 25.06.2012, 20:45
quelle

4 Antworten

7

Ich habe eine interessante Idee hier gefunden, die in Verbindung mit spencer7593 wird mir die Antwort auf das Subskript helfen, an das ich das PL / SQL übergeben kann Ausgabewerte. Um zu sagen:

%Vor%

Wo skip.sql eine leere Textdatei ist.  

UPDATE: Ich habe den Großteil davon in eine RUN.SQL -Datei verschoben, wo ich den booleschen Wert (0 oder 1) als &1 übergebe, den Skriptnamen, der bei Erfolg als aufgerufen werden soll &2 und dann alle anderen erwarteten Parameter, die an das aufgerufene Skript übergeben werden sollen. So sieht es in etwa so aus:

%Vor%     
Thought 27.06.2012, 23:30
quelle
4

Es ist nicht möglich.

SQLPlus bietet diese Kontrollebene für die Ausführung eines Skripts nicht.

Offensichtlich müssten Sie mit dem Befehl WHENEVER SQLERROR EXIT ... VERMEIDEN.

Es ist möglich, eine bedingte Kontrolle darüber zu erhalten, welche SQL-Anweisungen aufgrund von ausgelösten Ausnahmen (Fehlern) unter Verwendung von PL / SQL ausgeführt werden oder nicht. Dies betrifft jedoch keine SQLPlus-Befehle (die nicht innerhalb eines PL / SQL-Blocks ausgeführt werden können).

%Vor%

Natürlich hat dieser Ansatz seine eigenen Grenzen und Probleme. Alle DDL-Anweisungen müssten dynamisch aufgerufen werden. Der einfachste Weg dazu ist EXECUTE IMMEDIATE statement .

Das größte Problem (in Ihrem Fall) ist, dass es nicht möglich ist, SQLPlus-Befehle innerhalb eines PL / SQL-Blocks auszuführen.

    
spencer7593 25.06.2012 22:10
quelle
1

Sie können das Skript nicht beenden und in SQL * Plus bleiben, aber Sie können die Ausführung von Dingen stoppen. Es ist nicht schön, aber vorausgesetzt, Sie können das Skript ändern, um den Kontrollfluss hinzuzufügen, dann können Sie dies einfach mit Bind-Variable tun.

%Vor%

Wenn ausgeführt:

%Vor%

Alle PL / SQL-Blöcke im Skript können den Flag-Status beim Start prüfen und program_error (wie eine handliche vordefinierte Ausnahme) auslösen, um wieder zurück zu springen. Alles, was in einem PL / SQL-Block Fehler enthält, kann das Bindevariablen-Flag entweder direkt oder in einem Ausnahmebehandler aktualisieren. Und jede Nicht-PL / SQL-DML kann eine zusätzliche where -Klausel haben, um den Flag-Status zu prüfen. Wenn sie bis zum Erreichen dieser Anweisung auf N gesetzt wurde, wird keine Arbeit mehr ausgeführt. (Für ein insert würde ich sagen, das würde bedeuten, das values Formular nicht zu benutzen).

Was dies nicht tun kann, ist die Behandlung von Fehlern aus einfachen SQL-Anweisungen, aber ich bin mir nicht sicher, ob das ein Problem ist. Wenn dies der Fall ist, müssen diese möglicherweise in einem PL / SQL-Block in dynamisches SQL geändert werden.

    
Alex Poole 26.06.2012 08:21
quelle
-1

Ich weiß es alt, aber diese zwei Anweisungen am Anfang des SQL-Skripts machen die Arbeit:

WENN IMMER SQLERROR EXIT FAILURE ROLLBACK

WENN OSERROR EXIT FEHLER ROLLBACK

    
Anselme 25.08.2016 10:19
quelle

Tags und Links