Zum Inhalt springen

„Embedded SQL“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
[gesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
K Link auf sich selbst entfernt, zu großen Zeilenabstand entfernt
 
(19 dazwischenliegende Versionen von 14 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
'''Embedded SQL''' (eingebettetes [[SQL]], abgekürzt: ESQL) standardisiert die Syntax zum Einfügen von [[SQL]] Befehlen in Programmiersprachen. Die Einbettung in [[Ada (Programmiersprache)|Ada]], [[C (Programmiersprache)|C]], [[C++]], [[COBOL]], [[Fortran]], [[MUMPS]], [[Pascal (Programmiersprache)|Pascal]] und [[PL/I]] wird im Teil 3 ''Call-Level Interface'' (SQL/CLI) des [[SQL#Sprachstandard|SQL Standards]] ''ISO/IEC 9075'' behandelt und die Einbettung in [[Java (Programmiersprache)|Java]] im Teil 10 ''Object Language Bindings'' ([[SQLJ|SQL/OLB]]) des gleichen Standards.
'''Embedded SQL''' ({{enS}} für ''eingebettetes [[SQL]]'', abgekürzt '''ESQL''') standardisiert die Syntax zum Einfügen von SQL Befehlen in Programmiersprachen. Die Einbettung in [[Ada (Programmiersprache)|Ada]], [[C (Programmiersprache)|C]], [[C++]], [[COBOL]], [[Fortran]], [[MUMPS]], [[Pascal (Programmiersprache)|Pascal]] und [[PL/I]] wird im Teil 2 ''Foundation'' (SQL/Foundation) und die Einbettung in [[Java (Programmiersprache)|Java]] im Teil 10 ''Object Language Bindings'' ([[SQLJ|SQL/OLB]]) des [[SQL#Sprachstandard|SQL Standards]] ''ISO/IEC 9075'' spezifiziert.


== Technische Beschreibung ==
== Technische Beschreibung ==
ESQL Statements werden in die Abfolge der regulären Statements der Programmiersprache (= Hostsprache) eingefügt. Ein [[Precompiler]] wandelt die ESQL Statements in normalen Code der Hostsprache um, der dann mit dessen [[Compiler]] übersetzt wird. (Einige COBOL-Compiler enthalten einen integrierten ESQL-Precompiler.) Der umgewandelte Code enthält Aufrufe der [[Schnittstelle]] zur [[Datenbank]]. Diese Schnittstelle muss als [[Programmbibliothek|Bibliothek]] in das fertige Programm [[Linker (Computerprogramm)|gelinkt]] werden. Die Bibliothek ist abhängig von der verwendeten Datenbank und wird gewöhnlich vom jeweiligen Datenbankhersteller geliefert.
ESQL Statements werden in die Abfolge der regulären Statements der Programmiersprache (= Hostsprache) eingefügt. Ein [[Precompiler]] wandelt die ESQL Statements in normalen Code der Hostsprache um, der dann mit dessen [[Compiler]] übersetzt wird. (Einige COBOL-Compiler enthalten einen integrierten ESQL-Precompiler.) Der umgewandelte Code enthält Aufrufe der [[Schnittstelle]] zur [[Datenbank]]. Diese Schnittstelle muss als [[Programmbibliothek|Bibliothek]] in das fertige Programm [[Linker (Computerprogramm)|gelinkt]] werden. Die Bibliothek ist abhängig von der verwendeten Datenbank und wird gewöhnlich vom jeweiligen Datenbankhersteller geliefert.


Da ESQL standardisiert ist, sollten Programme mit ESQL - so lange keine [[proprietär]]en Eigenschaften des jeweiligen SQL-Dialektes verwendet werden - kompatibel mit Datenbanken verschiedener Hersteller sein, allerdings nur auf Ebene des [[Quellcode]]s. Das heißt, dass bei Wechsel des Datenbankfabrikats, manchmal sogar beim Versionsupdate der gleichen Datenbank, der Quellcode durch den ESQL-Precompiler und Compiler neu übersetzt und gegen die aktuelle Bibliothek gelinkt werden muss. Dies unterscheidet ESQL von Konzepten mit ähnlichem Einsatzzweck wie [[ODBC]] oder [[JDBC]], wo beim Wechsel der Datenbank (theoretisch) nur ein [[Gerätetreiber|Treiber]] ausgewechselt wird und das compilierte Programm weiter verwendet werden kann. Es gibt allerdings mindestens einen COBOL-Compiler, der ESQL-Anweisungen in Aufrufe von ODBC umwandelt.
Da ESQL standardisiert ist, sollten Programme mit ESQL solange keine [[proprietär]]en Eigenschaften des jeweiligen SQL-Dialektes verwendet werden kompatibel mit Datenbanken verschiedener Hersteller sein, allerdings nur auf Ebene des [[Quellcode]]s. Das heißt, dass bei Wechsel des Datenbankfabrikats, manchmal sogar beim Versionsupdate der gleichen Datenbank, der Quellcode durch den ESQL-Precompiler und Compiler neu übersetzt und gegen die aktuelle Bibliothek gelinkt werden muss. Dies unterscheidet ESQL von Konzepten mit ähnlichem Einsatzzweck wie [[ODBC]] oder [[JDBC]], wo beim Wechsel der Datenbank (theoretisch) nur ein [[Gerätetreiber|Treiber]] ausgewechselt wird und das kompilierte Programm weiter verwendet werden kann. Es gibt allerdings mindestens einen COBOL-Compiler, der ESQL-Anweisungen in Aufrufe von ODBC umwandelt.


Der Vorteil dieses Ansatzes der Datenbankanbindung liegt darin, dass zur Compilezeit nicht nur die SQL-[[Syntax]] sondern auch die Typverträglichkeit der Schnittstellenvariablen gegen die Datentypen des Datenbanksystems geprüft werden kann. Laufzeitgebundene Architekturen wie [[Open_Database_Connectivity|ODBC]], [[JDBC]], [[ActiveX Data Objects|ADO]] oder [[ADO.NET]] können keine Typprüfung vornehmen.
Der Vorteil dieses Ansatzes der Datenbankanbindung liegt darin, dass zur [[Compilezeit]] nicht nur die SQL-[[Syntax]], sondern auch die Typverträglichkeit der Schnittstellenvariablen gegen die Datentypen des Datenbanksystems geprüft werden kann. Laufzeitgebundene Architekturen wie [[Open Database Connectivity|ODBC]], [[JDBC]], [[ActiveX Data Objects|ADO]] oder [[ADO.NET]] können zu diesen Zeitpunkt keine Typprüfung vornehmen.


== Syntax ==
== Syntax ==
Zeile 15: Zeile 15:
</nowiki>
</nowiki>


z.B. COBOL:
z.&nbsp;B. COBOL:
<nowiki>
<nowiki>
EXEC SQL <sql-statement> END-EXEC.
EXEC SQL <sql-statement> END-EXEC.
</nowiki>
</nowiki>


z.B. C, C++, Ada:
z.&nbsp;B. C, C++, Ada:
<nowiki>
<nowiki>
EXEC SQL <sql-statement>;
EXEC SQL <sql-statement>;
Zeile 26: Zeile 26:


== Programmierung ==
== Programmierung ==
Die Kommunikation zwischen SQL und dem Anwendungsprogramm erfolgt per Hostvariablen. Werden diese Hostvariablen in einem SQL-Ausdruck benutzt, so wird ihnen ein Doppelpunkt voran gestellt.
Die Kommunikation zwischen SQL und dem Anwendungsprogramm erfolgt per Programmvariablen. Werden diese Programmvariablen in einem SQL-Ausdruck benutzt, so wird ihnen ein Doppelpunkt vorangestellt.


Beispiel:
Beispiel:
Zeile 36: Zeile 36:
;
;


Vor der Ausführung des SQL-Befehls muss in der umgebenden Programmiersprache die Variable 'pnr' mit einem Wert belegt werden. Nach Ausführung des SQL-Befehls sind die Variablen 'vorname' und 'nachname' mit Werten belegt - sofern überhaupt ein Satz gefunden wurde.
Vor der Ausführung des SQL-Befehls muss in der umgebenden Programmiersprache die Variable 'pnr' mit einem Wert belegt werden. Nach Ausführung des SQL-Befehls sind die Variablen 'vorname' und 'nachname' mit Werten belegt sofern überhaupt ein Satz gefunden wurde.


In einer Datenbank-Tabelle können Spalten mit <code>Null</code>-Werten definiert werden. Bei den meisten Programmiersprachen (mit Ausnahme von [[PL/SQL]]) können Variablen nicht mit <code>Null</code>-Werten belegt werden, sondern eine Variable ist immer mit irgendeinem Wert belegt.
In einer Datenbank-Tabelle können Spalten mit <code>Null</code>-Werten definiert werden. Bei den meisten Programmiersprachen können Variablen nicht mit <code>Null</code>-Werten belegt werden, sondern eine Variable ist immer mit irgendeinem Wert belegt.


Wenn auf Tabellenspalten zugegriffen werden soll, die auch <code>Null</code>-Werte enthalten, dann müssen Indikatorvariablen verwendet werden. Sie müssen vom Typ <code>int</code> angelegt werden. Diese Variable wird auf einen Wert kleiner 0 gesetzt, falls die Spalte in der Datenbank <code>Null</code> enthält.
Wenn auf Tabellenspalten zugegriffen werden soll, die auch <code>Null</code>-Werte enthalten, dann müssen Indikatorvariablen verwendet werden. Sie müssen vom Typ <code>int</code> angelegt werden. Diese Variable wird auf einen Wert kleiner 0 gesetzt, falls die Spalte in der Datenbank <code>Null</code> enthält.


Beispiel:
Beispiel:
Zeile 50: Zeile 50:
;
;


Die Variablen 'vorname' und 'nachname' werden hier - wie auch im Beispiel oben - zur Aufnahme der gelesenen Werte verwendet. Zusätzlich geben die Indikatorvariablen 'i_vorname' und 'i_nachname' an, ob der Vorname und der Nachname überhaupt vorhanden war. Wenn z.B. nur der Nachname gespeichert war und der Vorname unbekannt (<code>Null</code>) war, dann wurde 'i_nachname' mit 0 und 'i_vorname' mit -1 belegt.
Die Variablen 'vorname' und 'nachname' werden hier wie auch im Beispiel oben zur Aufnahme der gelesenen Werte verwendet. Zusätzlich geben die Indikatorvariablen 'i_vorname' und 'i_nachname' an, ob der Vorname und der Nachname überhaupt vorhanden war. Wenn z.&nbsp;B. nur der Nachname gespeichert war und der Vorname unbekannt (<code>Null</code>) war, dann wurde 'i_nachname' mit 0 und 'i_vorname' mit −1 belegt.

== Siehe auch ==
* [[Pro*C]]


== Literatur ==
== Literatur ==
* {{Literatur| Titel=ISO 9075 Part 1: Framework | Verlag=ISO/IEC | Jahr=2003 | Auflage=2. | Kommentar=Referenznummer: 9075-1:2003(E), Abschnitte: 4.8.1, 5.3.3.1 | Online=[http://lampsvn.epfl.ch/svn-repos/dubochet/dbc/trunk/doc/9075(2003)%20ISO%20SQL%20standard/9075(2003)%201%20framework.pdf PDF] }}
* {{Literatur| Titel=ISO 9075 Part 1: Framework | Verlag=ISO/IEC | Datum=2003 | Auflage=2. | Kommentar=Referenznummer: 9075-1:2003(E), Abschnitte: 4.8.1, 5.3.3.1 | Online=[https://web.archive.org/web/20160304081026/http://lampsvn.epfl.ch/svn-repos/dubochet/dbc/trunk/doc/9075%282003%29%20ISO%20SQL%20standard/9075%282003%29%201%20framework.pdf web.archive.org] |Format=PDF |KBytes=582 |Abruf=2021-08-24}}
* {{Literatur| Titel=ISO 9075 Part 2: Foundation | Verlag=ISO/IEC | Jahr=2003 | Auflage=2. | Kommentar=Referenznummer: 9075-2:2003(E), Kapitel: 20 Embedded SQL | Online=[http://lampsvn.epfl.ch/svn-repos/dubochet/dbc/trunk/doc/9075(2003)%20ISO%20SQL%20standard/9075(2003)%202%20foundation.pdf PDF] }}
* {{Literatur| Titel=ISO 9075 Part 2: Foundation | Verlag=ISO/IEC | Datum=2003 | Auflage=2. | Kommentar=Referenznummer: 9075-2:2003(E), Kapitel: 20 Embedded SQL | Online=[https://web.archive.org/web/20160304083044/http://lampsvn.epfl.ch/svn-repos/dubochet/dbc/trunk/doc/9075%282003%29%20ISO%20SQL%20standard/9075%282003%29%202%20foundation.pdf web.archive.org] |Format=PDF |KBytes=139 |Abruf=2021-08-24}}
* {{Literatur| Titel=ISO 9075 Part 3: Call-Level Interface | Verlag=ISO/IEC | Jahr=2003 | Auflage=3. | Kommentar=Referenznummer: 9075-3:2003(E), Anhang B.1 (Übersetzungsbeispiele von Embedded SQL nach low-level Library Function Calls) | Online=[http://lampsvn.epfl.ch/svn-repos/dubochet/dbc/trunk/doc/9075(2003)%20ISO%20SQL%20standard/9075(2003)%203%20call-level%20interface.pdf PDF] }}
* {{Literatur| Titel=ISO 9075 Part 3: Call-Level Interface | Verlag=ISO/IEC | Datum=2003 | Auflage=3. | Kommentar=Referenznummer: 9075-3:2003(E), Anhang B.1 (Übersetzungsbeispiele von Embedded SQL nach low-level Library Function Calls)}}


== Weblinks ==
== Weblinks ==
* [http://www.postgresql.org/docs/9.2/interactive/ecpg.html ECPG - Embedded SQL in C]. PostgreSQL 9.2.0 Documentation, 2012 (Beschreibung der [[PostgreSQL]] Implementation von Embedded SQL).
* [https://www.postgresql.org/docs/current/static/ecpg.html ECPG Embedded SQL in C]. PostgreSQL Documentation, (Beschreibung der [[PostgreSQL]] Implementation von Embedded SQL).


{{Navigationsleiste SQL}}
== Siehe auch ==
* [[Pro*C]]


[[Kategorie:Datenbankschnittstelle]]
[[Kategorie:Datenbankschnittstelle]]
[[Kategorie:SQL]]
[[Kategorie:SQL]]

[[en:Embedded SQL]]
[[fi:Embedded SQL]]
[[ja:埋め込みSQL]]
[[ru:Embedded SQL]]
[[zh:嵌入式SQL]]

Aktuelle Version vom 17. Juni 2024, 12:56 Uhr

Embedded SQL (englisch für eingebettetes SQL, abgekürzt ESQL) standardisiert die Syntax zum Einfügen von SQL Befehlen in Programmiersprachen. Die Einbettung in Ada, C, C++, COBOL, Fortran, MUMPS, Pascal und PL/I wird im Teil 2 Foundation (SQL/Foundation) und die Einbettung in Java im Teil 10 Object Language Bindings (SQL/OLB) des SQL Standards ISO/IEC 9075 spezifiziert.

Technische Beschreibung

[Bearbeiten | Quelltext bearbeiten]

ESQL Statements werden in die Abfolge der regulären Statements der Programmiersprache (= Hostsprache) eingefügt. Ein Precompiler wandelt die ESQL Statements in normalen Code der Hostsprache um, der dann mit dessen Compiler übersetzt wird. (Einige COBOL-Compiler enthalten einen integrierten ESQL-Precompiler.) Der umgewandelte Code enthält Aufrufe der Schnittstelle zur Datenbank. Diese Schnittstelle muss als Bibliothek in das fertige Programm gelinkt werden. Die Bibliothek ist abhängig von der verwendeten Datenbank und wird gewöhnlich vom jeweiligen Datenbankhersteller geliefert.

Da ESQL standardisiert ist, sollten Programme mit ESQL – solange keine proprietären Eigenschaften des jeweiligen SQL-Dialektes verwendet werden – kompatibel mit Datenbanken verschiedener Hersteller sein, allerdings nur auf Ebene des Quellcodes. Das heißt, dass bei Wechsel des Datenbankfabrikats, manchmal sogar beim Versionsupdate der gleichen Datenbank, der Quellcode durch den ESQL-Precompiler und Compiler neu übersetzt und gegen die aktuelle Bibliothek gelinkt werden muss. Dies unterscheidet ESQL von Konzepten mit ähnlichem Einsatzzweck wie ODBC oder JDBC, wo beim Wechsel der Datenbank (theoretisch) nur ein Treiber ausgewechselt wird und das kompilierte Programm weiter verwendet werden kann. Es gibt allerdings mindestens einen COBOL-Compiler, der ESQL-Anweisungen in Aufrufe von ODBC umwandelt.

Der Vorteil dieses Ansatzes der Datenbankanbindung liegt darin, dass zur Compilezeit nicht nur die SQL-Syntax, sondern auch die Typverträglichkeit der Schnittstellenvariablen gegen die Datentypen des Datenbanksystems geprüft werden kann. Laufzeitgebundene Architekturen wie ODBC, JDBC, ADO oder ADO.NET können zu diesen Zeitpunkt keine Typprüfung vornehmen.

ESQL Statements setzen sich zusammen aus:

EXEC SQL <sql-statement> <terminator>   für Nicht-Java
#sql { <sql-statement> };               für Java
 

z. B. COBOL:

EXEC SQL <sql-statement> END-EXEC.
 

z. B. C, C++, Ada:

EXEC SQL <sql-statement>;
 

Die Kommunikation zwischen SQL und dem Anwendungsprogramm erfolgt per Programmvariablen. Werden diese Programmvariablen in einem SQL-Ausdruck benutzt, so wird ihnen ein Doppelpunkt vorangestellt.

Beispiel:

EXEC SQL
SELECT vorname, nachname
INTO :vorname, :nachname
FROM mitarbeitertabelle
WHERE pnr = :pnr
;

Vor der Ausführung des SQL-Befehls muss in der umgebenden Programmiersprache die Variable 'pnr' mit einem Wert belegt werden. Nach Ausführung des SQL-Befehls sind die Variablen 'vorname' und 'nachname' mit Werten belegt – sofern überhaupt ein Satz gefunden wurde.

In einer Datenbank-Tabelle können Spalten mit Null-Werten definiert werden. Bei den meisten Programmiersprachen können Variablen nicht mit Null-Werten belegt werden, sondern eine Variable ist immer mit irgendeinem Wert belegt.

Wenn auf Tabellenspalten zugegriffen werden soll, die auch Null-Werte enthalten, dann müssen Indikatorvariablen verwendet werden. Sie müssen vom Typ int angelegt werden. Diese Variable wird auf einen Wert kleiner 0 gesetzt, falls die Spalte in der Datenbank Null enthält.

Beispiel:

EXEC SQL
SELECT vorname, nachname
INTO :vorname :i_vorname, :nachname :i_nachname
FROM mitarbeitertabelle
WHERE pnr = :pnr
;

Die Variablen 'vorname' und 'nachname' werden hier – wie auch im Beispiel oben – zur Aufnahme der gelesenen Werte verwendet. Zusätzlich geben die Indikatorvariablen 'i_vorname' und 'i_nachname' an, ob der Vorname und der Nachname überhaupt vorhanden war. Wenn z. B. nur der Nachname gespeichert war und der Vorname unbekannt (Null) war, dann wurde 'i_nachname' mit 0 und 'i_vorname' mit −1 belegt.

  • ISO 9075 Part 1: Framework. 2. Auflage. ISO/IEC, 2003 (web.archive.org [PDF; 582 kB; abgerufen am 24. August 2021] Referenznummer: 9075-1:2003(E), Abschnitte: 4.8.1, 5.3.3.1).
  • ISO 9075 Part 2: Foundation. 2. Auflage. ISO/IEC, 2003 (web.archive.org [PDF; 139 kB; abgerufen am 24. August 2021] Referenznummer: 9075-2:2003(E), Kapitel: 20 Embedded SQL).
  • ISO 9075 Part 3: Call-Level Interface. 3. Auflage. ISO/IEC, 2003 (Referenznummer: 9075-3:2003(E), Anhang B.1 (Übersetzungsbeispiele von Embedded SQL nach low-level Library Function Calls)).