Wie kann man zwischen SQL und PL / SQL unterscheiden?

16

Ich weiß, die Frage klingt vielleicht zu dumm, aber ich habe diesen Teil nie verstanden.

SQL * Plus funktioniert sowohl mit SQL als auch mit PL / SQL. Woher weiß ich, ob ein Code SQL oder PL / SQL ist? Wenn mein Code eine for-Schleife hat, ist es dann nicht mehr SQL?

PL / SQL ist eine Erweiterung für SQL, die Schleifen, Bedingungen usw. enthält. Ist dann jeder SQL-Code standardmäßig PL / SQL-Code? Ist es nicht so

Gibt es eine Abgrenzung zwischen SQL und PL / SQL?

Zwei Beispiele für die Unterscheidung von s / w-SQL und PL / SQL, die diese Frage ausgelöst haben:

Was ist der Unterschied zwischen diesen beiden Anweisungen zum Erstellen von Tabellen?

/programming/2267386/oracle-11g-varray-of-objects/2267813#2267813

Laser
quelle

Antworten:

12

Es ist sicher eine interessante Frage. Die meisten Leute, die mit der Oracle-Entwicklung vertraut sind, würden sich keine Gedanken darüber machen, aber wenn Sie darauf zurückkommen, ist es manchmal verwirrend, die Abgrenzung zwischen SQL und PL / SQL zu definieren.

Wenn Sie sich die Definition der Akronyme ansehen, erhalten Sie eine Vorstellung davon, welche Funktionsbereiche jeweils abgedeckt sind:

SQL - Structured Query Language

PL / SQL - Prozedurale Sprache / Strukturierte Abfragesprache

Dem aufmerksamen Leser fällt möglicherweise auf, dass SQL zweimal angezeigt wird. 8) Dies liegt daran, dass SQL häufig in PL / SQL eingebettet ist - PL / SQL ist eine Sprache, die eine proprietäre Sprache der 4. Generation (4GL) bietet , die mit Datenbankobjekten in sehr gut funktioniert Orakel.

Wikipedia hat ziemlich gutes Material sowohl zu SQL als auch zu PL / SQL

Der verwirrende Teil ist, dass sich PL / SQL und SQL ein wenig überschneiden. SQL umfasst das Einfügen, Abfragen, Aktualisieren und Löschen von Daten, die so genannten DML- oder Datenbearbeitungs-Sprachoperationen, aber auch das Erstellen, Ändern, Umbenennen und Löschen von DDL- oder Datendefinitions-Sprachoperationen. Es ist hier, wo manche verwirrt werden könnten. Die Operation zum Erstellen einer gespeicherten Prozedur, die mit PL / SQL geschrieben wurde, ist eigentlich SQL. Sie verwenden SQL, um das Datenbankobjekt zu erstellen, das einen PL / SQL-Block darstellt.

Ebenso können Sie SQL-Code in PL / SQL einbetten. Eine FOR-Schleife in PL / SQL kann beispielsweise auf einer SQL-Abfrage basieren. Bläst dir ein bisschen den Verstand, was? Sie erstellen eine Prozedur mit SQL, die intern SQL verwendet, um bestimmte Aktionen für Datensätze aus der Datenbank auszuführen.

Coole Sachen, wenn du mich fragst.

ScottCher
quelle
2
In der Tat ist die Linie unscharf. Sie können eine SQL-Anweisung schreiben, um eine PL / SQL-Prozedur zu erstellen, in der eine SQL-Anweisung enthalten ist, die eine PL / SQL-Funktion mit einer SQL-Anweisung usw. aufruft.
Leigh Riffel
1
@Leigh down the Rabbit Hole wir gehen!
ScottCher
Ich würde nicht sagen, dass die Linie überhaupt verschwommen ist. PL / SQL ist der prozedurale Wrapper für SQL. Die meisten PL / SQL-Anweisungen enthalten SQL-Anweisungen, müssen dies jedoch nicht. Sie können die tatsächlichen SQL-Cursor in v$sqlusw. verfolgen
William Robertson
12

Wenn es eingewickelt ist

  • BEGIN ... END
  • DECLARE ... END
  • CREATE OR REPLACE ... END
  • Wird ein Einzeiler vorangestellt EXECUTE

Dann ist es PL / SQL. Was bedeutet das unter der Haube? SQL wird zu einem Abfrageplan "kompiliert" und ausgeführt, wobei sofort eine Ergebnismenge für den Fall SELECToder die Anzahl der in anderen Fällen betroffenen Zeilen oder ein Fehler zurückgegeben wird. PL / SQL ist jedoch mehr beteiligt. Jedes Objekt, auf das verwiesen wird, wird auf Vorhandensein und erforderliche Berechtigungen überprüft. Anschließend wird PL / SQL in nahezu nativen Code kompiliert , der mit voller Geschwindigkeit ausgeführt wird. Die Abhängigkeiten werden nachverfolgt. Wenn sich eine Tabelle ändert, muss jede PL / SQL-Referenz, die darauf verweist, erneut kompiliert werden. Der Grund dafür ist Geschwindigkeit; Da zur Kompilierungszeit alles von vornherein erledigt wird, müssen in PL / SQL keine Laufzeitprüfungen durchgeführt werden, wohingegen SQL-Anweisungen jedes Mal überprüft werden müssen (auch wenn Abfragepläne zwischengespeichert werden, die sogenannte Soft-Analyse), Privilegien müssen noch geprüft werden, und selbst ein Soft-Parsing ist mit Kosten verbunden).

Dies ist einer der "Killer-Vorteile" von gespeicherten Prozeduren, wie sie von Oracle ausgeführt werden. Das Ausführen eines in PL / SQL gespeicherten Prozesses oder Triggers führt zu einem absoluten Minimum an Berechnungen, um das Ergebnis zu erhalten. Anwendungscode, der außerhalb des nicht vertrauenswürdigen Oracle-Kernels ausgeführt wird, muss durch weitere Rahmen springen, um an die Daten zu gelangen. Dies ist das gleiche Argument für stark typisierte, referenziell transparente Hochsprachen wie OCaml oder Haskell. Führen Sie zur Kompilierungszeit mehrmals eine Arbeit aus und profitieren Sie von den Vorteilen, die sich aus der millionenfachen Ausführung des Codes ergeben.

Gaius
quelle
2
Zum Mix hinzufügen CALL ist eine SQL-Anweisung, die zum Ausführen einer gespeicherten Programmeinheit verwendet wird und unter der Haube als BEGIN ... END
Gary,
2
Wie bei EXECUTE ist es syntaktischer Zucker
Gaius
5

Gibt es eine Abgrenzung zwischen SQL und PL / SQL?

SQL ist ein Standard *.

PL / SQL ist eine Herstellererweiterung des SQL-Standards *.

* SQL ist eine Sprache , die eine explizite Grammatik und Regeln dafür , wie die Grammatik implementiert werden soll, hat und ist aber nicht ein Standard - per-se . Da es jedoch eine Sprachspezifikation gibt, auf die sich alle einigen können, wäre alles, was in SQL geschrieben ist, portierbar, wenn das Programm nur in SQL geschrieben wäre.

Da es sich bei PL / SQL jedoch um eine Herstellererweiterung handelt, enthält es Sprachteile, die andere Hersteller möglicherweise nicht unterstützen.

jcolebrand
quelle
3
Ich würde sagen, dass PL / SQL ein De-facto-Standard ist, während SQL ein De-jure-Standard ist :-)
Gaius
3
@Gaius und von dieser Aussage allein würde ich zwei Dinge erraten: Sie sind ein ORA dev, und Sie TSQL denken ist nur unordentlich: p
jcolebrand
@jcolebrand Mein erster DBA-Job war eigentlich bei Sybase, aber Sie haben Recht, ich arbeite heutzutage hauptsächlich mit Oracle. Ich würde mich sehr freuen, wenn Sie entweder T-SQL oder PL / SQL in eine der beiden Datenbanken schreiben könnten, aber die Sprachen spiegeln deren Plattformen wider (z. B. T-SQL ist so, wie es ist, weil Cursor und Sperren in SQL Server und seinen Nachkommen teuer sind , und PL / SQL ist so, wie es ist, weil jemand bei Oracle zuletzt am DoD gearbeitet hat) :-)
Gaius
@Gaius Ah ja, das alte Argument über Standards ist so gut, weil es so viele zur Auswahl gibt. Ich denke, es ist gut anzuzeigen, dass SQL ein "Standard" ist und dass PL / SQL proprietär ist, also +1 @jcolebrand.
ScottCher
@ScottCher ~ Danke dafür. Ich fühle mich dumm zu sagen, dass es eine Norm ist, weil es keine (afaik) Normstelle gibt, die sie mit einem Gütesiegel versehen und mit einer Nummer versehen kann. Aber es ist klar definiert und vereinbart. ;)
jcolebrand