PL/SQL: gibt es eine Anweisung, um vollständig zu stoppen die Ausführung von Skript?
Ich versuche zu tun, einige checkings auf ein DB-schema am Anfang eines PL/SQL-Skript.
Wenn die checkings geben, unterlegen Ergebnisse, ich will halt das Skript, um zu verhindern, dass die nächsten Anweisungen ausgeführt werden.
Ich habe so etwas wie dieses
-- 1st line of PL/SQL script
DECLARE
SOME_COUNT INTEGER;
BEGIN
SELECT COUNT(*) INTO SOME_COUNT FROM SOME_TABLE WHERE <SOME_CONDITIONS>;
IF (SOME_COUNT > 0) THEN
DBMS_OUTPUT.PUT_LINE('Test failed, I don''want the rest of the script'
|| ' to be executed.');
--EXIT or something like that?... <= STOP EXECUTION HERE
END IF;
END;
/
-- OTHER SQL INSTRUCTIONS...
ALTER TABLE SOME_TABLE ...
Ich bin auf der Suche nach der instruction(s) - damit zu tun, die "STOP EXECUTION HERE
".
Sind Sie wirklich reden über eine PL/SQL-Skript? Oder ein SQLPlus-Skript? Man kann nicht eine DDL-Anweisung in PL/SQL (es sei denn, Sie steckte es in eine
Vielen Dank für Ihren Kommentar, Justin. In der Tat bin ich kein "Oracle-Experten", auch wenn ich über gute Kenntnisse von DBMS im Allgemeinen. Also ich habe noch nicht begreifen, den Unterschied zwischen PL/SQL oder SQL*Plus-Skripte (kennst du ein paar Blogs/doc/Website erklären Sie deutlich, dass Sie einen Unterschied?). Alles, was ich sagen kann ist, dass ich mit Navicat, mit dem "Abfrage" - Bereich und laden meine Skript-Datei. In diesem spezifischen Kontext
EXECUTE IMMEDIATE
). So erscheint es mir, dass Sie reden über eine SQLPlus-Skript. Wenn du redest über ein SQLPlus-Skript, wenn der PL/SQL-block Fehler, SQLPlus wird standardmäßig fortsetzen der Ausführung des nächsten SQL-Anweisung (oder PL/SQL-block) in das Skript. Sie müssten verwenden Sie die SQL*Plus-Befehl WHENEVER SQLERROR EXIT
.Vielen Dank für Ihren Kommentar, Justin. In der Tat bin ich kein "Oracle-Experten", auch wenn ich über gute Kenntnisse von DBMS im Allgemeinen. Also ich habe noch nicht begreifen, den Unterschied zwischen PL/SQL oder SQL*Plus-Skripte (kennst du ein paar Blogs/doc/Website erklären Sie deutlich, dass Sie einen Unterschied?). Alles, was ich sagen kann ist, dass ich mit Navicat, mit dem "Abfrage" - Bereich und laden meine Skript-Datei. In diesem spezifischen Kontext
RAISE_APPLICATION_ERROR()
macht den job.InformationsquelleAutor Frosty Z | 2012-01-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Basierend auf der Frage, ich bin nicht einverstanden mit der Antwort akzeptiert. Die Frage zeigt ein multi-statement-batch-Skript. RAISE_APPLICATION_ERROR() nur Ausgänge aus einem PL/SQL-block (sub-Programm), nicht aus dem Gesamt-Skript (wie bereits von Justin) so wird es weitergehen mit Anweisungen, die Folgen.
Für batch-scripts, ist es am besten zu verwenden, WENN SQLERROR EXIT. Ja, es ist ein SQL*Plus-Richtlinie, nicht SQL-standard, ist aber ziemlich tragbar; beliebtesten Oracle-tools zur Unterstützung von Skripts unterstützt diese Richtlinie, zumindest teilweise. Das folgende Beispiel funktioniert in SQL*Plus, SQL*Developer, Toad, SQLsmith und eventuell andere, und veranschaulicht das problem, wenn Sie kommentieren Sie die Zeile aus.
Wenn Sie entfernen, WENN SQLERROR, wird das script weiter und führen Sie den 2nd block, etc. das ist genau das, was die Frage bittet zu vermeiden.
Den Vorteil, in diesem Fall von grafischen tools, die emulieren sqlplus, ist, dass Sie wirklich aufhören, das Skript und nicht Einreichen der Rest des Skripts, um die Kommando-shell als shell-Befehle, die ist, was passiert, wenn Sie fügen Sie Skripts in SQL*Plus ausgeführt, in einem console-Fenster. SQL*Plus kann die Ausfahrt auf Fehler, aber die restlichen gepufferten Befehle werden dann behandelt, indem die Betriebssystem-shell, die ist ein bisschen chaotisch und potenziell riskant, wenn Sie shell-Befehle in die Kommentare (das ist nicht ungewöhnlich). Mit SQLPlus, ist es immer am besten eine Verbindung herstellen, und führen Sie dann das Skript, oder übergeben Sie es in der < start > - Befehl für die Kommandozeile (sqlplus scott/tiger @foo.sql), dies zu vermeiden.
+1 das hat wirklich geholfen. Ich wusste, dass über Ausnahmen und Fehler in der Anwendung, aber ich brauche eine Vorbedingung check-in ein DDL-Skript, die sollten aufhören das Skript. Die alternative (DDL in einer IF-Anweisung in einem PL/SQL-Skript) ist nicht sehr verlockend.
InformationsquelleAutor codenheim
Wenn Sie nicht wollen, eine Ausnahme auslösen, Sie könnten versuchen, so etwas wie (ungetestet):
Einige Leute hassen es, jede GOTO-Anweisungen, wie Sie kann dazu führen, spaghetti-code, wenn Sie missbraucht werden, aber in einfachen Situationen wie diese (wieder, vorausgesetzt, Sie wollen nicht, um eine Ausnahme), Sie funktionieren gut, imo.
ALTER TABLE
... )bunch of great code
, dass viele derEXECUTE IMMEDIATE
workaround ist, infolgedessen der script-code weniger lesbar/wartbar.Ja, das ist ein anderes problem als deine OP, aber ich Stimme zu, dass einige code gibt, ist weit entfernt von "toll" 😉 Das Kommentar war ein bisschen Zunge in der Wange, aber wieder der Punkt war zu geben, eine Alternative Lösung für Ihre Frage.
InformationsquelleAutor tbone
Ein paar Sekunden googeln gab mir die Antwort: die Funktion
RAISE_APPLICATION_ERROR()
User-definierte Fehler-code sollte zwischen -20000 und -20999.
Details auf Oracle doc hier: http://docs.oracle.com/cd/B10501_01/appdev.920/a96624/07_errs.htm#877 (Abschnitt Definition Eigener Fehlermeldungen: Prozedur RAISE_APPLICATION_ERROR)
raise_application_error
im code, den Sie geschrieben, die in Ihrer Frage, es wird brechen Sie aus der PL/SQL-block, aber dieOTHER SQL INSTRUCTIONS
Abschnitt noch ausgeführt werden. Ist es das, was Sie sind, nach?InformationsquelleAutor Frosty Z
Anstatt werfen eine Anwendung Fehler, es ist viel einfacher zu benutzen Sie einfach die
RETURN
- Schlüsselwort beendet die aktuelle PL/SQL-block sehr reibungslos.Nur sicherstellen, dass Sie tun, eine
DBMS_OUTPUT.PUT_LINE('Exited because <error')
vor, um die Benutzer mit einer netten Nachricht, warum Sie verlassen natürlich!InformationsquelleAutor Jonny