2. Datenbank-Programmierung Ansätze der Datenbank-Programmierung 2. Datenbank-Programmierung • SQL ist eingeschränkt bezüglich der algorithmischen Mächtigkeit, z.B. Berechnung einer transitiven Hülle ist in Standard-SQL nicht möglich. • Die Einschränkung ist von Bedeutung für die Terminierung, die Endlichkeit von Ergebnissen und die Optimierbarkeit. • Für Datenbank-Anwendungen braucht man oft die vollständige Mächtigkeit einer Programmiersprache. Ansätze hierfür: – Call-Schnittstelle: Bibliothek für den Zugriff auf die Datenbank – Einbettung von SQL in eine Wirtssprache – Erweiterung von SQL um Kontrollstrukturen – Erweiterung existierender Programmiersprachen zu persistenten Programmiersprachen Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, WS 2012/13 31 2. Datenbank-Programmierung Ansätze der Datenbank-Programmierung Prozedurale Schnittstelle / Call-Schnittstelle • Dem Programmierer wird eine Bibliothek von Prozeduren (bzw. Klassen und Methoden) zur Verfügung gestellt, die den Zugriff und die Manipulation der Datenbank gewährleisten. • Keine eigenständige Datenbanksprache, d.h. keine direkte Nutzung von SQL im Quelltext • Stattdessen: Die auszuführenden SQL-Anweisungen werden als String-Parameter über die vordefinierten Prozeduren/Methoden an das Datenbanksystem gegeben. • Benötigte Softwarewerkzeuge: Compiler der Wirtssprache, Bibliothek/Treiber • Vertreter: ODBC, JDBC, SQL/CLI (call level interface) Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, WS 2012/13 32 2. Datenbank-Programmierung Ansätze der Datenbank-Programmierung Prozedurale Schnittstelle (2) • SQL-Anweisungen können zur Laufzeit konstruiert werden. • Aus Sicht der Wirtssprache werden die SQL-Anweisungen in Form von Zeichenketten zur Verfügung gestellt. • Eine syntaktische und semantische Analyse der SQL-Anweisung findet ebenfalls erst zur Laufzeit statt. • Vom Datenbanksystem werden spezifische Prozeduren für die Behandlung variabler Ergebnisrelationen bereitgestellt (Cursor-Konzept, später mehr). Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, WS 2012/13 33 2. Datenbank-Programmierung Ansätze der Datenbank-Programmierung Statische Einbettung in eine Wirtssprache • SQL wird als eigenständige Sprache in eine existierende Sprache (Wirtssprache, z.B. Java) eingebettet und somit direkt eingesetzt. • hierzu syntaktische Kennzeichnung der SQL-Anweisungen • Die Syntax und der Compiler der Wirtssprache wird nicht modifiziert. • zusätzlich notwendige Softwarewerkzeuge: Precompiler • Vertreter: Embedded SQL, SQLJ Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, WS 2012/13 34 2. Datenbank-Programmierung Ansätze der Datenbank-Programmierung Statische Einbettung (2) • SQL-Anweisungen werden in den Programmtext eingestreut und syntaktisch gekennzeichnet. • Ein Precompiler ersetzt die SQL-Anweisungen in Anweisungen für eine prozedurale Schnittstelle der Wirtssprache. • Schon zur Übersetzungszeit ist eine syntaktische und semantische Analyse möglich. • Das vom Precompiler generierte Programm kann anschließend von einem gewöhnlichen Compiler für die Wirtssprache übersetzt werden. ☞ Die SQL-Anweisungen müssen zur Übersetzungszeit (nahezu) feststehen. ☞ Nur Werte in Ausdrücken der Where-Klausel sind variabel. Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, WS 2012/13 35 2. Datenbank-Programmierung Ansätze der Datenbank-Programmierung Prozedurale Spracherweiterung von SQL • SQL wird um Konzepte einer Programmiersprache erweitert: Variable, Kontrollstrukturen, etc.. • Vorteil: engere Verbindung mit SQL möglich, Übernahme des SQL-Typsystems, kein Impedance Mismatch • Nachteil: es muss eine komplett neue Sprache gelernt werden • dedizierte Softwarewerkzeuge sind notwendig • Vertreter: PL/SQL (und dessen Nachbauten, z.B. bei IBM DB2 oder Postgres) Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, WS 2012/13 36 2. Datenbank-Programmierung Ansätze der Datenbank-Programmierung Cursor-Konzept • Gewöhnliche Programmiersprachen bieten zwar Strukturen aber keine Mengen als Datentyp an. • Eine Ergebnisrelation in SQL ist aber eine Menge von Tupeln. ☞ Das Ergebnis einer SQL-Anfrage kann nicht direkt in einen Wert eines Datentyps der Wirtssprache abgebildet werden (Impedance Mismatch). • Das Konzept des Cursors bietet eine abstrakte Sichtweise auf eine Ergebnisrelation. Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, WS 2012/13 37 2. Datenbank-Programmierung Ansätze der Datenbank-Programmierung Cursor Anwendungsprogramm ☞ Ein Cursor stellt eine Art Zeiger auf die Zeilen einer Ergebnisrelation dar. Datenbank SQL−Anfrage C++ Cursor Ergebnisrelation ☞ Ein gutes Bild ist es, sich den Cursor als einzeiliges Fenster auf die Ergebnisrelation vorzustellen. ☞ Dieses Fenster wird schrittweise über die Ergebnisrelation geschoben. Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, WS 2012/13 38 2. Datenbank-Programmierung Ansätze der Datenbank-Programmierung Cursor-Anweisungen nach SQL-Standard DECLARE CURSOR: Mit einer Cursordeklaration wird u.a. der Name des Cursors und die zugehörige Cursortabelle (Ergebnisrelation) definiert. DECLARE Cursorname [SCROLL] CURSOR [WITH HOLD] FOR Abfrageausdruck [ORDER BY-Klausel ] [Modifikationsklausel ] Modifikationsklausel: FOR READ ONLY | UPDATE [OF Spaltenname {, Spaltenname }] Beispiel: declare caddr cursor for select customer_id, name Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, WS 2012/13 39 2. Datenbank-Programmierung Ansätze der Datenbank-Programmierung from customer where address = ’Stanford’ • Der Abfrageausdruck (Cursorformel) ist der wichtigste Bestandteil einer CursorAnweisung. Er legt die Cursortabelle fest. • Durch SCROLL stehen zusätzliche Positionierungsmöglichkeiten des Cursors bei FETCH INTO zur Verfügung. Nur in Zusammenhang mit READ ONLY möglich. Ohne SCROLL: nur sequentieller Durchlauf • WITH HOLD: Cursor bleibt über ein COMMIT hinaus im geöffneten Zustand. OPEN CURSOR: Berechnung der Ergebnisrelation OPEN Cursorname Beispiel: open caddr Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, WS 2012/13 40 2. Datenbank-Programmierung Ansätze der Datenbank-Programmierung FETCH INTO: Positioniert den Cursor auf ein bestimmtes Tupel der Cursortabelle und überträgt die Attributwerte dieses Tupels in Variablen der Wirtssprache. FETCH [[FETCH-Orientierung ] FROM] Cursoname INTO Zielspez {, Zielspez } FETCH-Orientierung: NEXT | PRIOR | FIRST | LAST | ABSOLUTE wert | RELATIVE wert fetch caddr into :cid, :name cid und name sind hier Hostvariablen, d.h. Variablen der Wirtssprache, die zur Aufnahme von Werten aus der Datenbank dienen. Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, WS 2012/13 41 2. Datenbank-Programmierung Ansätze der Datenbank-Programmierung UPDATE CURRENT: Ändern des aktuellen Tupels UPDATE Relationenname SET-Klausel WHERE CURRENT OF Cursorname DELETE CURRENT: Löschen des aktuellen Tupels DELETE FROM Relationenname WHERE CURRENT OF Cursorname CLOSE: Freigabe der Ergebnisrelation CLOSE Cursorname Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, WS 2012/13 42 2. Datenbank-Programmierung JDBC JDBC Auf separaten Folien! Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, WS 2012/13 43