Statische Einbettung

Werbung
Kapitel 9
Embedded SQL
Prof. Dr. Wolfgang Weber
Vorlesung Datenbanken
1
Embedded SQL
(siehe auch [Date00])
Arbeitsweise ähnlich PL/SQL,
allerdings: Normale Programmiersprache mit eingestreuten SQL-Befehlen und anderen Befehlen zum
Anbinden an die Datenbank und zur Abarbeitung der Ergebnisse
z. B. exec sql select Nummer from Produkt …
SQL-Befehle werden durch Precompiler gefunden und vorübersetzt.
•
Statische Einbettung:
Zur Übersetzungszeit wird SQL-Anweisungen in Prozeduren der Programmiersprache übersetzt.
Wie soll vorgegangen werden, wenn genaues Aussehen der SQL-Anfrage erst zur Laufzeit bekannt?
•
Dynamische Einbettung:
Während der Laufzeit werden
z. B. Bedingungen abgefragt
dann:
Abhängig von Benutzereingaben wird
- SQL-Befehl als String zusammengesetzt,
- zur Laufzeit übersetzt,
- ausgeführt.
Prof. Dr. Wolfgang Weber
Vorlesung Datenbanken
2
Embedded SQL – connect, declare
Statische Einbettung:
Beispiel (Literatur: siehe auch Heuer, Saake: Datenbanken [HS00]):
(Anweisungen teilweise abhängig von Programmiersystem – z. B. in Pascal string statt char(30))
exec sql connect Toepfer_DB; // Verbindung mit DB
exec sql declare Produkt table
(Nummer int,
Bezeichnung char (30),
Groesse int,
… restl. Attribute von Produkt … ); // Bekanntgabe des Aufbaus (kein create table!)
// einer existierenden Relation
// (dadurch: Übersetzung des Programms auch ohne
// Anbindung der Datenbank möglich.)
Prof. Dr. Wolfgang Weber
Vorlesung Datenbanken
3
Embedded SQL – Variablendeklaration, update
exec sql begin declare section; // Deklaration von Programmvariablen, die sowohl vom
neueGroesse int;
// Programm als auch von SQL-Anweisungen benutzt
zielNummer int;
// werden können:
Nummer int;
Bezeichnung char(30);
exec sql end declare section;
neueGroesse = 35;
zielNummer = 12032;
// Nutzung der deklarierten Variablen in Anweisungen der
// Progr-Sprache
exec sql update Produkt
set Groesse = :neueGroesse
// und SQL
where Nummer = :zielNummer;
Prof. Dr. Wolfgang Weber
Vorlesung Datenbanken
4
Embedded SQL – insert, Lesen in Variablen
//Einfügung von Tupeln:
exec sql insert into Produkt
values (12345, Vase, 23, …weitere Attributwerte …);
//Datentransfer zwischen Datenbank und Programm:
exec sql select Nummer, Bezeichnung, Groesse
into :Nummer, :Bezeichnung, :neueGroesse
from Produkt
where Nummer = :zielNummer;
Prof. Dr. Wolfgang Weber
Vorlesung Datenbanken
5
Embedded SQL - Cursor
weitere Beispiel
//Einsatz des Cursors:
exec sql declare AktProdukt_Cursor cursor for
select Nummer, Bezeichnung
from Produkt for update;
exec sql open AktProdukt_Cursor;
//Holen des 1. Tupels:
exec sql fetch AktProdukt_Cursor
into :Nummer, :Bezeichnung;
//Löschen des Aktuellen Tupels:
exec sql delete // der Cursor muss zuvor mit ‘for update (of) ‘ deklariert sein!
from Produkt
where current of AktProdukt_Cursor;
exec sql close AktProdukt_Cursor;
Prof. Dr. Wolfgang Weber
Vorlesung Datenbanken
6
Embedded SQL - Fehler- und Ausnahmebehandlung
//Einbinden der SQL-Communication Area:
exec sql include sqlca; Es wird stets Variable sqlcode zurückgegeben
(sqlcode = 100: not found,
sql-code<0: sqlerror,
sql-code>0 und ungleich 100: sqlwarning)
//Abfragen des Fehlerfalls:
exec sql whenever not found goto Fehler_Label
// auch: Abfrage auf sqlerror, sql-warning
// auch: Aktion continue, stop, call
Prof. Dr. Wolfgang Weber
Vorlesung Datenbanken
7
Embedded SQL - Transaktionssteuerung
//Erfolgreiches Ende einer Transaktion
//( = Abspeichern der durchgeführten Änderungen in DB):
exec sql commit work;
// Abbruch / Zurücksetzen der Transaktion
// bei Systemfehler (z. B. Division durch 0., Integritätsverletzung) oder explizit durch:
exec sql rollback work;
Prof. Dr. Wolfgang Weber
Vorlesung Datenbanken
8
Embedded SQL – Dynamische Einbettung
= Übersetzung erst zur Ausführungszeit.
Notwendig: wenn zur Laufzeit nicht nur Variablen, sondern z. B. ganze SQL-Statements
vom Benutzer eingegeben und als Abfrage an DB gestellt werden sollen.
Beispiel:
exec sql begin declare section
dcl AnfrageString char(256) varying;
exec sql end declare section;
exec sql declare AnfrageObjekt statement; //AnfrageObjekt vom Datentyp statement
exec sql Anfragestring := ‘DELETE FROM Produkt WHERE Preis > 200‘; //evtl. auch
//Erstellung des Anfragestrings gemäß Eingaben durch den Benutzer
exec sql prepare AnfrageObjekt from :AnfrageString; //erzeugt optimierte Abfrage
exec sql execute AnfrageObjekt; //führt optimierte Abfrage aus
//anschließendes Holen der einzelnen Tupel etwas aufwendiger als bei statischer
Einbettung (siehe [O‘Neil: Databas Principles, …])
Prof. Dr. Wolfgang Weber
Vorlesung Datenbanken
9
Herunterladen