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