Wir haben diese Woche in meinem Unternehmen einige Debatten darüber geführt, wie wir unsere SQL-Skripte schreiben sollen.
Hintergrund: Unsere Datenbank ist Oracle 10g (baldiges Upgrade auf 11). Unser DBA-Team verwendet SQLPlus, um unsere Skripte für die Produktion bereitzustellen.
Jetzt hatten wir kürzlich eine Bereitstellung, die fehlgeschlagen ist, weil sowohl ein Semikolon als auch ein Schrägstrich ( /
) verwendet wurden. Das Semikolon stand am Ende jeder Anweisung und der Schrägstrich stand zwischen den Anweisungen.
alter table foo.bar drop constraint bar1;
/
alter table foo.can drop constraint can1;
/
Später im Skript wurden einige Trigger hinzugefügt, einige Ansichten erstellt und einige gespeicherte Prozeduren. Sowohl die ;
als auch die /
Anweisung haben dazu geführt, dass jede Anweisung zweimal ausgeführt wurde, was zu Fehlern führte (insbesondere bei den Einfügungen, die eindeutig sein mussten).
In SQL Developer passiert dies nicht, in TOAD nicht. Wenn Sie bestimmte Befehle ausführen, funktionieren diese ohne die /
darin enthaltenen nicht.
Wenn Sie in PL / SQL ein Unterprogramm (DECLARE, BEGIN, END) haben, wird das verwendete Semikolon als Teil des Unterprogramms betrachtet, sodass Sie den Schrägstrich verwenden müssen.
Meine Frage lautet also: Wenn Ihre Datenbank Oracle ist, wie können Sie Ihr SQL-Skript richtig schreiben? Da Sie wissen, dass Ihre Datenbank Oracle ist, sollten Sie immer die verwenden /
?
sqlterminator
,!
wenn Sie möchten), und diese Konvention wird in der Regel von anderen Tools befolgt. Die PL / SQL-Sprache verwendet jedoch Semikolons als obligatorisches Syntaxelement.Antworten:
Es ist eine Frage der Präferenz, aber ich bevorzuge Skripte, die konsistent den Schrägstrich verwenden - auf diese Weise können alle "Arbeitseinheiten" (Erstellen eines PL / SQL-Objekts, Ausführen eines anonymen PL / SQL-Blocks und Ausführen einer DML-Anweisung) ausgeführt werden leichter mit dem Auge herausgesucht.
Wenn Sie schließlich zur Bereitstellung zu Ant wechseln, wird die Definition von Zielen vereinfacht, um ein konsistentes Anweisungsbegrenzer zu erhalten.
quelle
/
oder;
siehe die Antwort von @a_horse_with_no_name oder @Mr_Moneybags für mehr KontextIch weiß, dass dies ein alter Thread ist, aber ich bin nur darauf gestoßen und ich habe das Gefühl, dass dies nicht vollständig erklärt wurde.
In SQL * Plus gibt es einen großen Unterschied zwischen der Bedeutung von a
/
und a,;
da sie unterschiedlich funktionieren.Das
;
beendet eine SQL-Anweisung, während das/
alles ausführt, was sich im aktuellen "Puffer" befindet. Wenn Sie also a;
und a verwenden, wird/
die Anweisung tatsächlich zweimal ausgeführt.Sie können dies leicht erkennen, indem Sie a verwenden,
/
nachdem Sie eine Anweisung ausgeführt haben:In diesem Fall bemerkt man den Fehler tatsächlich.
Angenommen, es gibt ein SQL-Skript wie dieses:
Und dies wird in SQL * Plus ausgeführt, dann ist dies sehr verwirrend:
Das
/
ist hauptsächlich erforderlich, um Anweisungen auszuführen, die;
wie eineCREATE PROCEDURE
Anweisung eingebettet sind .quelle
;
) enthalten, müssen Sie einen Weg finden, ein alternatives Trennzeichen anzugebenIch wollte etwas mehr Verwendung zwischen dem
;
und dem klären/
In SQLPLUS:
;
bedeutet "Beenden Sie die aktuelle Anweisung, führen Sie sie aus und speichern Sie sie im SQLPLUS-Puffer"<newline>
Nach einer DML-Anweisung (SELECT, UPDATE, INSERT, ...) oder einigen Arten von DDL-Anweisungen (Erstellen von Tabellen und Ansichten) (die no enthalten;
) bedeutet dies, dass die Anweisung im Puffer gespeichert, aber nicht ausgeführt wird./
Nach Eingabe einer Anweisung in den Puffer (mit einem Leerzeichen<newline>
) bedeutet "DML oder DDL oder PL / SQL im Puffer ausführen".RUN
oderR
ist ein Befehl sqlsplus, um die SQL im Puffer anzuzeigen / auszugeben und auszuführen. Eine SQL-Anweisung wird nicht beendet./
Während der Eingabe einer DML oder DDL oder PL / SQL bedeutet "Beenden Sie die aktuelle Anweisung, führen Sie sie aus und speichern Sie sie im SQLPLUS-Puffer".ANMERKUNG: Da
;
für PL / SQL zum;
Beenden einer Anweisung keine Anweisung von SQLPLUS verwendet werden kann, bedeutet dies "Beenden der aktuellen Anweisung, Ausführen und Speichern im SQLPLUS-Puffer", da der gesamte PL / SQL-Block vollständig im Puffer, dann führen Sie es aus. PL / SQL-Blöcke müssen enden mit:quelle
Fast alle Oracle-Bereitstellungen erfolgen über SQL * Plus (das seltsame kleine Befehlszeilentool, das Ihr DBA verwendet). Und in SQL * Plus bedeutet ein einzelner Schrägstrich im Grunde "den letzten SQL- oder PL / SQL-Befehl, den ich gerade ausgeführt habe, erneut ausführen".
Sehen
Als Faustregel gilt, Schrägstriche für Dinge zu verwenden, die funktionieren
BEGIN .. END
oder wo Sie sie verwenden könnenCREATE OR REPLACE
.Für Einsätze, die eindeutig verwendet werden müssen
quelle
Nach meinem Verständnis benötigen alle SQL-Anweisungen keinen Schrägstrich, da sie am Ende von Semikolons automatisch ausgeführt werden, einschließlich DDL-, DML-, DCL- und TCL-Anweisungen.
Für andere PL / SQL-Blöcke, einschließlich Prozeduren, Funktionen, Pakete und Trigger, muss Oracle wissen, wann der Block ausgeführt werden muss, da es sich um mehrzeilige Programme handelt. Daher müssen wir am Ende jedes Blocks einen Schrägstrich schreiben Lassen Sie Oracle es ausführen.
quelle
Ich verwende den Schrägstrich am Ende jedes Skripts nur einmal, um sqlplus mitzuteilen, dass keine Codezeilen mehr vorhanden sind. In der Mitte eines Skripts verwende ich keinen Schrägstrich.
quelle