Das ist die Frage.
In einem kürzlich erschienenen Beitrag in den OTN-Foren wurde nach der Verwendung von Semikolons und Schrägstrichen als Abschlusszeichen für Anweisungen gefragt. Ich habe einen Artikel zu diesem Thema entstaubt, den ich vor über 4 Jahren für unser Entwicklungsteam geschrieben habe. Dieser Artikel hat gute Kritiken erhalten und ist auf Wunsch in den OTN-Foren verfügbar. Ich dachte, ich poste es auch auf meinem Blog. Hier ist der Artikel:
Schrägstrich oder kein Schrägstrich
von Brian Peasland
In unserem Unternehmen werden bereitgestellte SQL-Skripte im SQL*Plus-Befehlszeilendienstprogramm von Oracle ausgeführt, während viele Entwickler ein GUI-Tool wie PL/SQL Developer oder SQL Developer verwenden. Der Schrägstrich bedeutet für SQL*Plus etwas, das in PL/SQL Developer oder SQL Developer nicht benötigt wird. Daher kann es verwirrend sein zu wissen, ob Sie einen Schrägstrich in Ihre SQL-Skripte einfügen müssen oder nicht. Hoffentlich wird dieser Abschnitt etwas Licht ins Dunkel bringen, was der Schrägstrich macht, wann man ihn benutzt und wann man ihn nicht benutzt. Semikolon-Endzeichen Bei den meisten SQL-Anweisungen ist das Semikolon das Anweisungs-Endzeichen. Betrachten Sie zum Beispiel diese einfache SQL-Anweisung, die in SQL*Plus ausgeführt wird:
SQL> wählen Sie sysdate aus dual;
SYSDATE
———
18.06.12
Wenn SQL*Plus das Semikolon sieht, weiß es, dass das Ende der SQL-Anweisung erreicht wurde, und es kann jetzt den Befehl ausführen.
SQL*Plus-Puffer
Sie wissen vielleicht nicht, dass SQL*Plus einen Puffer für seine Befehle hat. Wenn ich die Taste „l“ für „Liste“ drücke, kann ich den Befehl sehen, der sich derzeit im Puffer meiner Sitzung befindet.
SQL>l
1* sysdate von dual auswählen
Nicht überraschend gibt es den Befehl, den ich gerade ausgeführt habe. Ich habe dann eine weitere SQL-Anweisung ausgeführt und so sieht mein Puffer jetzt aus:
SQL>l
1 wählen Sie sysdate,user
2* von dual
Wie Sie sehen können, habe ich jetzt zwei Zeilen im SQL*Plus-Puffer meiner Sitzung.
Slash =Puffer ausführen
Die erste Regel, die Sie über den Schrägstrich verstehen müssen, ist, dass der Schrägstrich für SQL*Plus bedeutet, den Inhalt des Puffers auszuführen. Um dieses Konzept zu veranschaulichen, werde ich eine SQL-Anweisung ausführen, ein paar Sekunden warten und dann dieselbe SQL-Anweisung erneut ausführen, aber nur den Puffer ausführen.
SQL> select to_char(sysdate,’MM/DD/YYYY HH24:MI:SS’) from dual;
TO_CHAR(SYSDATE,’MM
——————-
18.06.2012 15:20:40
SQL> /
TO_CHAR(SYSDATE,’MM
——————-
18.06.2012 15:21:17
SQL> /
TO_CHAR(SYSDATE,’MM
——————-
18.06.2012 15:21:50
Wie Sie sehen, habe ich beim zweiten und dritten Mal nur „/“ eingegeben und die Eingabetaste gedrückt, und SQL*Plus hat jedes Mal den Inhalt seines Befehlspuffers ausgeführt.
PL/SQL-Blöcke
Das Semikolon-Anweisungsabschlusszeichen funktionierte gut, bis Oracle PL/SQL in Oracle Version 7 einführte. Das Problem ist, dass PL/SQL-Blöcke mehrere Semikolons haben können, um die einzelnen Anweisungen zu beenden, aus denen dieser Block besteht. Betrachten Sie diesen sehr einfachen PL/SQL-Block, der nichts tut:
SQL> beginnen
2 null;
3 null;
4 Ende;
5
Die Zeilen 2 und 3 enthalten absolut gültige Anweisungen, die jeweils mit dem Semikolon abgeschlossen werden. Und in Zeile 4 haben wir das Schlüsselwort END, das das Ende des PL/SQL-Blocks kennzeichnet. Wenn wir keine verschachtelten BEGIN/END-Paare zulassen würden, würde SQL*Plus jedes Mal „END;“ sehen. es würde wissen, dass das Ende des PL/SQL-Blocks erreicht wurde, aber wir dürfen verschachtelte BEGIN/END-Paare, also ist Folgendes vollkommen legal und gültig:
SQL> beginnen
2 beginnen
3 null;
4 Ende;
5 null;
6 Ende;
7
Sie können aus dem Obigen erkennen, dass Sie einfach nach „END;“ suchen. reicht nicht aus, da SQL*Plus versucht hätte, den Block nach Zeile 4 auszuführen. Wie hat Oracle also entschieden, anzuzeigen, dass der PL/SQL-Block zur Ausführung bereit war? Die Antwort ist die Verwendung des Schrägstrichs, wie Sie vielleicht bereits wissen. Die zweite zu verstehende Regel ist, dass der Schrägstrich nur dazu dient, wenn Sie ihn zum Beenden eines PL/SQL-Blocks verwenden, SQL*Plus anzuweisen, das auszuführen, was sich im Puffer befindet! Dies hat sich seit der Erstellung von PL/SQL für Oracle 7 nicht geändert. Betrachten Sie das folgende Beispiel:
SQL> beginnen
2 null;
3 Ende;
4 /
PL/SQL-Prozedur erfolgreich abgeschlossen.
SQL>l
1 begin
2 null;
3* Ende;
In Zeile 4 habe ich den Schrägstrich eingegeben, um den PL/SQL-Block auszuführen. Sie können sehen, dass mein Block erfolgreich abgeschlossen wurde. Wenn wir zurückgehen und uns den Inhalt meines Befehlspuffers ansehen, können Sie sehen, dass er alles außer dem Schrägstrich enthält. Der Schrägstrich ist nicht Teil des Befehlspuffers. Also führe ich jetzt einen anderen PL/SQL-Block aus:
SQL> beginnen
2 dbms_output.put_line(‘Heute ist ‘||to_char(sysdate,’MM/DD/YYYY HH24:MI:SS’));
3 Ende;
4 /
Heute ist der 18.06.2012 15:39:32
PL/SQL-Prozedur erfolgreich abgeschlossen.
Der Schrägstrich sagte zu SQL*Plus, dass es ausführen soll, was sich in seinem Puffer befindet, und die Ergebnisse werden angezeigt. Geben wir jetzt nur noch einmal den Schrägstrich ein und wir sollten sehen, dass unser PL/SQL-Block erneut ausgeführt wird.
SQL> /
Heute ist der 18.06.2012 15:40:42
PL/SQL-Prozedur erfolgreich abgeschlossen.
Ich musste meinen PL/SQL-Block nicht neu eingeben, da er sich derzeit im Befehlspuffer befindet.
PL/SQL und SQL-Entwickler und PL/SQL-Blöcke
Das größte Problem für die meisten Entwickler besteht darin, dass Sie bei PL/SQL Developer und SQL Developer keinen Schrägstrich verwenden müssen. Wieso den? Weil Sie Ausführen (F8) oder Skript ausführen (F5) drücken können, um Ihren PL/SQL-Block auszuführen. Der PL/SQL-Entwickler weiß, dass Sie in dem Moment, in dem Sie F8 drücken, beabsichtigen, den auszuführenden PL/SQL-Block zu übermitteln. In diesem Fall erfüllt F8 in PL/SQL Developer dieselbe Aufgabe wie der Schrägstrich in SQL*Plus. Ähnlich für F5 in SQL Developer.
Das Problem in meinem Unternehmen ist, dass unser Team, das Code für die Produktion bereitstellt, keinen Code mit PL/SQL Developer oder SQL Developer bereitstellt. Sie verwenden SQL*Plus, weil das Skripten mehrerer Ausführungen mit einem Befehlszeilentool einfacher ist. Viele Entwickler machen den Fehler, den Schrägstrich für PL/SQL-Blöcke nicht in Skripts aufzunehmen, weil sie ihn nicht benötigen, aber wenn Sie diesen Codeabschnitt in einem SQL-Skript bereitstellen möchten, ist der Schrägstrich am Ende jeder PL erforderlich /SQL-Block.
Wann Slash nicht verwendet werden sollte
Wir haben also gesehen, wann und warum wir den Schrägstrich verwenden, aber wann ist es schlecht, ihn zu verwenden? Die dritte zu beachtende Regel ist, dass es schlecht ist, den Schrägstrich nach einer einzelnen SQL-Anweisung (nicht in einem PL/SQL-Block) zu verwenden, insbesondere wenn dieser Schrägstrich unmittelbar auf eine DML-Anweisung (INSERT, UPDATE oder DELETE) folgt. Wenn mein Skript Folgendes enthält:
wählen Sie sysdate aus dual;
/
Dann erhalte ich eine „doppelte Ausgabe“, was ich normalerweise in einem Skript nicht vorhabe. Ich möchte wirklich, dass nur eine Zeile zurückgegeben wird, nicht zwei, wie es das obige Skript tun würde:
SQL> wählen Sie sysdate aus dual;
SYSDATE
———
18.06.12
SQL> /
SYSDATE
———
18.06.12
Noch schlimmer ist es, wenn ich den Schrägstrich nach einer DML-Anweisung verwende, da diese Anweisung zweimal ausgeführt wird. Betrachten Sie das folgende Skript:
in test_tab Werte einfügen (10);
/
Wir wissen jetzt, dass SQL*Plus, wenn ich die beiden obigen Zeilen in einem Skript ausführe, es aufgrund des Semikolon-Anweisungsabschlusszeichens einmal und dann ein zweites Mal ausführt, weil der Schrägstrich SQL*Plus anweist, das auszuführen, was in der steht Befehlspuffer. Wenn ich das obige zweizeilige Skript ausführe, erhalte ich die folgende Ausgabe:
SQL> in test_tab-Werte einfügen (10);
1 Zeile erstellt.
SQL>
/
in test_tab Werte einfügen (10) *
FEHLER in Zeile 1:ORA-00001:Unique Constraint (PEASLAND.SYS_C00767176) verletzt
Hoppla! Die erste Einfügung funktionierte (1 Zeile erstellt.), aber als der Schrägstrich eingegeben wurde, versuchte SQL*Plus, dieselben Daten einzufügen, und ich wurde von einer eindeutigen Einschränkungsverletzung erfasst.
Schlussfolgerung
Hoffentlich zeigt diese Seite, warum der Schrägstrich benötigt wird, was er tut und wann er nicht verwendet werden sollte. Zur Erinnerung:
- Schließen Sie den Schrägstrich am Ende jedes PL/SQL-Blocks ein
- Fügen Sie den Schrägstrich nicht nach SQL-Anweisungen ein, die sich nicht in einem PL/SQL-Block befinden.
- Der Schrägstrich nach einer einzelnen SQL-Anweisung führt dazu, dass dieser SQL-Befehl zweimal ausgeführt wird.