Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Bedingungsbasierte Spool-Generierung in Oracle SQL-Skript

Wenn Sie diesen steuernden Abschnitt in ein eigenes Skript einfügen können, z. elcm_ctl.sql , könnten Sie das machen:

accept run_it char format a1 prompt "Run the script?"

set termout off

whenever sqlerror exit success rollback
exec if upper(nvl('&run_it', 'N')) != 'Y' then raise no_data_needed; end if;
whenever sqlerror continue

spool c:\elcm.sql
select 'select sysdate from dual;' from dual;
spool off

set termout on

spool c:\elcm_details.spl
@c:\elcm.sql
spool off

Die akzeptieren Befehl ist meiner Meinung nach etwas ordentlicher, als sich auf Substitutionsaufforderungen zu verlassen, und ist in gewisser Weise selbstdokumentierend. Dadurch wird der Benutzer mit der angegebenen Zeichenfolge aufgefordert, anstatt nur mit 'gen' . (In SQL * Plus können Sie dies erweitern und den Benutzer zwingen, ein einzelnes Zeichen einzugeben, und erneut aufgefordert werden, wenn er etwas Längeres eingibt; und standardmäßig auf 'N' zu setzen, wenn er nur die Eingabetaste drückt, ohne etwas einzugeben. Aber SQL Developer unterstützt nur eine Teilmenge der Funktionalität).

Dann wirft ein kleiner anonymer Block eine Ausnahme - egal welche - wenn der eingegebene Variablenwert nicht 'y' ist oder 'Y' . Dabei habe ich gesetzt Termout aus Sie sehen also nicht die eigentliche Ausnahme. Und ich habe bei jedem SQL-Fehler um das Skript zu beenden, wenn diese Ausnahme ausgelöst wird, sodass alles, was später kommt, nicht ausgeführt wird. Das ist alles andere im Kontrollskript, nicht nur die nächste Abfrage, sondern Sie könnten mehrere Teilskripts haben, wenn Sie flexibler sein müssten.

Aber in SQL Developer, termout funktioniert nur wie erwartet, wenn Sie über @ laufen . Wenn Sie den Inhalt von elcm_ctl.sql ausführen direkt aus dem SQL-Arbeitsblatt sehen Sie, dass die Ausnahme ausgelöst wird, was ein bisschen hässlich ist. Speichern Sie stattdessen dieses Kontrollskript und führen Sie in einem leeren Arbeitsblatt einfach Folgendes aus:

@c:\elcm_ctl.sql

Führen Sie dieses Arbeitsblatt als Skript aus und Sie werden aufgefordert; wenn Sie 'Y' eingeben Sie sehen die Ausgabe des Skripts im Skriptausgabefenster (es sei denn, Sie lassen set termout off im Steuerskript), und es wird die Spool-Datei erstellt. Wenn Sie etwas anderes eingeben, wird elcm.sql nicht ausgeführt Datei, zeigt nichts im Ausgabefenster des Skripts an und erstellt keine Spool-Datei.