Bisher: Grundlagen / Theorie DBS: Anwendungsprogrammierung Daten Schema Datenbank 1 Daten Schema Datenbank 2 DBMS Benutzer 1 Benutzer 2 Benutzer n Hier: Idee der Praxis Datenbanksysteme Benutzer Anwendungskontrollkomponenten (AC) Visuelle Objekte Prozessobjekte AC_Auftrags. Auftrags daten Kunden daten Auftragsbearbeitung Business Komponenten (BC) BC_Kunde BC_Auftrag Infrastrukturkomponenten (IC) IC_DB IC_TX 1
DBS: Anwendungsprogrammierung Vorgehen beim Zugriff auf DB (Server) aus Anwendungprogrammen (Client): 1. Client öffnet einen Kanal (open connection) zu der Datenbank 2. Client stellt Anfragen an die DB und/oder sendet updates (als Oberbegriff für insert/update/delete) an die Datenbank 3. Falls Zugriff auf die DB nicht mehr benötigt, schließt der Client den Kanal (close connection) Nutzung der DB aus Programmen: Embedded SQL in universellen Programmiersprachen (Host Sprachen) t S h wie COBOL, C, Java, Das eingebettete SQL wird durch Klammerung EXEC SQL BEGIN EXEC SQL END oder ähnlich in den Programmen kenntlich gemacht (unterschiedlich für die verschiedenen Host Sprachen) Kommunikation i.d.r. über gemeinsame Variablen (shared variables), üblicherweise mit einem Doppelpunkt (:) als Präfix in SQL kenntlich gemacht 2
DBS: Embedded SQL: Connections Kanal (Connection) mehrfach möglich aber nur eine zu einem Zeitpunkt in einem Programm aktiv Befehle: Öffnen eines Kanals: CONNECT TO server-name AS connection-name AUTHORIZATION user-account-info; Änderen des aktiven Kanals: SET CONNECTION connection-name; Schließen des Kanals: DISCONNECT connection-name; 3
DBS: Embedded SQL in C Variablen innerhalb eines DECLARE Statements werden gemeinsam genutzt und können (mit Doppelpunkt als Präfix) in SQL Befehlen auftreten SQLCODE liefert Fehler bzw. Ausnahmen bei der SQL Abarbeitung Beispiel: int loop; EXEC SQL BEGIN DECLARE SECTION; varchar N_Name[16], N V_Name[16], Adresse[100]; char P_ID[10], Geb_Dat[11], ; int Abt_Nr, Gehalt, SQLCODE, ; EXEC SQL END DECLARE SECTION; loop = 1; while (loop) { prompt ( Eingabe Personen-Identifikator:, P_ID); EXEC SQL select V_Name, N_Name, Name Adr, Gehalt into :V_Name, :N_Name, :Adresse, :Gehalt from Personal where P-ID = :P_ID; if (SQLCODE == 0) printf(v_name, ); else printf( Personen-Identifikator existiert nicht:, P_ID); prompt( Weitere Personen? (1=ja, 0=nein):, loop); END-EXEC } 4
DBS: Embedded SQL in prozeduralen Sprachen Cursor Konzept: Für mengenwertige Antworten wird ein Cursor definiert, der als Iterator für die Menge funktioniert Minimale Funktionalität DECLARE: Deklaration über SFW Klausel OPEN: Führt das SQL Statement aus und setzt Iterator auf das erste Element FETCH: Holt das aktuelle Element und setzt den Iterator weiter CLOSE: Schließt den Cursor Ergänzungen z.b. RESET Beispiel: PL/1 für DB2... 11 EXEC SQL DECLARE BUECHER CURSOR FOR 12 SELECT AUTOR, TITLE, PREIS 13 FROM BUCH 14 WHERE PREIS >:MIN; 17 EXEC SQL OPEN BUECHER, 18 WEITERE_BUECHER := '1'B, 19 DO WHILE (WEITERE_BUECHER); 20 EXEC SQL FETCH BUECHER INTO :AUTOR, :TITEL, :PREIS; 21 IF SQLCODE = 100 22 THEN WEITERE_BUECHER := '0'B; 23 ELSE PUT SKIP LIST (AUTOR, TITEL, PREIS); 24 END; 25 EXEC SQL CLOSE BUECHER; 5
DBS: Embedded SQL in Java SQLJ: Ein Standard für SQL in Java Ein SQLJ Übersetzer transformiert SQL Befehle in Java Code Die übersetzten Befehle werden durch die JDBC Schnittstelle ausgeführt JDBC ist eine Bibliothek für Java um auf Datenbanken zuzugreifen Dazu müssen entsprechene Klassen importiert werden: z.b. java.sql Ein Java Programm mit JDBC kann jede beliebige Datenbank nutzen, dieüber eine JDBC Treiber verfügt Über JDBC kann ein Programm gleichzeitig mehrere Datenbanken nutzen 6
DBS: Embedded SQL in Java Vorgehen Datenbankzugriff über JDBC 1. Importiere die JDBC:Bibliothek (java.sql.*) 2. Lade Ld den JDBC Treiber: Class.forname( oracle.jdbc.driver.oracledriver ) l d l i 3. Vereinbare die notwendigen Variablen 4. Definiere ein Connection Objekt (mit getconnection) 5. Definiere ein Befehls Objekt aus der Befehlsklasse, entweder aus PreparedStatement oder aus Callable Statement 6. Identifiziere die Parameter des Befehls (gekennzeichnet durch? ) 7. Binde Bfhl Befehls Variabelnan l Programm Variablen 8. Führe den SQL Befehl (das Objekt) aus mit JDBC executequery 9. Bearbeite das Ergebnis der Abfrage (wird als 2 dimensionale Tabelle vom Typ ResultSet geliefert) 7
DBS: Embedded SQL in Java Beispiel: pid = readentry( Gebe Personal-ID ein: "); try { #sql{select V_Name, N_Name, Adr, Gehalt into :vname, :nname, :adresse, :gehalt from PERSONAL where P_ ID = :pid}; } catch (SQLException se) { System.out.println( Personen-Id existiert nicht:",+pid); return; } System.out.println(vname + " " + nname + ); SQLJ unterstützt 2 unterschiedliche Iteratoren: Benannte Iteratoren: diese sind mit dem Ergebnis einer Anfrage verknüpft Positionsiteratoren: listen die Attributtypen eines Anfrageergebnisses auf Eine FETCH Operation liefert das nächste Tupel eines Anfrageergebnisses: fetch iterator variable into programm variable 8
DBS: Dynamisches SQL Ziel: Zusammenstellung und Ausführung von (nicht vorübersetzten) SQL Befehlen zur Laufzeit Die Befehle werden interaktiv zur Laufzeit eingegeben oder Eine grafische Benutzungsoberfläche erlaubt den Zusammenbau von SQL Befehlen Dynamische Updates sind einfach Dynamische Abfragen können sehr komplex werden, da Anzahl und jeweiliger Typ der abgefragten Attribute zum Übersetzungszeitpunkt unbekannt sind Beispiel: EXEC SQL BEGIN DECLARE SECTION; varchar sqlupdatestring[256]; EXEC SQL END DECLARE SECTION; prompt ( Gebe SQL-Befehl ein:, sqlupdatestring); EXEC SQL PREPARE sqlcommand FROM :sqlupdatestring; EXEC SQL EXECUTE sqlcommand; 9
DBS: Zugriff über API Dynamische DB Programmierung mit einer Funktionsbibliothek (API) Vorteil: Ki Keine Vorübersetzung notwendig und damitflexibler Nachteil: Syntx Check muss zu Laufzeit erfolgen Istim SQL Standard Standard vorgesehen Einfacher Zugriff auf mehere Datenbanken aus einem Programm Bestimmte Bibliotheken (z.b. sqlcli.h für C) müssen installiert sein SQL Befehle werden dynamisch erzeugt und als Zeichenketten übergeben Komponenten von SQL/CLI: Environment record: Verwaltet die DB Connections (Connection Pool) Connection record: Für jede Connection die notwendigen Informationen Statement record: Für jeden SQL Befehl die notwendigen Informationen Description record: Für jeden Befehl die menge der Tupel 10
Vorgehen DBS: Zugriff über API (C) 1. Lade SQL/CLI Bibliotheken 2. Vereinbare Variablen um Records für die oben genannten Komponenten zu verwalten (Benennung: SQLHSTMT, SQLHDBC, SQLHENV, SQLHDEC) 3. Initialisiere einenumgebungs Record mit SQLAllocHandle 4. Initialisiere einen Connection Record mit SQLAllocHandle 5. Initialisiere einenbefehls Record mit SQLAllocHandle 6. Bereite den SQL Befehl mit der Funktion SQLPrepare vor 7. Binde die Parameter mit Programmvariablen 8. Führe den SQL Befehl mit SQLExecute aus 9. Verknüpfe Attribute der Abfrage mit Variablen in C mittels SQLBindCol 10. Nutze SQLFetch um die Attributwerte t t des jeweilsnächsten Tupels in die C Variablen zu laden 11
DBS: Funktionalität IN Datenbanken Stored Procedures Persistente Prozeduren und Funktionen (Module) existieren in der DB und werden vom DBMS (vom Server, nicht vom Client) ausgeführt Vorteile: Vermeidet Redundanz, wenn viele Anwendungen diese Funktionalität benötigen Reduziert Kommunikationsaufwand, da nur im Server ausgeführt Damit können auch komplexere Views definiert werden Nachteil Stored Procedures zwar inzwischen genormt, dennoch existieren große Unterschiede zwischen den Produkten: Portabilität Genereller Aufbau einer Stored Procedure CREATE PROCEDURE procedure name (params) local declarationsl l procedure body; Genereller Aufbau einer Stored Function CREATE FUNCTION fun name name (params) RETRUNS return type type local declarations function body; Aufruf einer Prozedur oder Funktion: CALL procedure name/function name (Argumente); 12
DBS: Funktionalität IN Datenbanken SQL/PSM: Teil des SQL(>:1999) Standards für persistente Module (persistent stored modules) SQL + Stored Procedures/Functions + zusätzliche prozedurale Kontrollstrukturen Erweitert die Mächtigkeit von SQL zu einer vollständigen Programmiersprache Beispiel SQL/PSM: CREATE FUNCTION Abteilungsgroesse(IN AbtNr INTEGER) RETURNS VARCHAR[7] DECLARE Anz_Mitarb INTEGER; SELECT COUNT (*) INTO Anz_Mitarb FROM SELECT Personal WHERE Abt_Nr = AbtNr; IF Anz_Mitarb > 100 THEN RETURN sehr gross ELSEIF T Anz_Mitarb > 50 THEN RETURN gross ELSEIF TOT_EMPS > 30 THEN RETURN mittel ELSE RETURN klein ENDIF; 13
DBS: Aufbau/Funktionen von DBMS Anwendungsprogramme (Logische) Datenstrukturen (Logische) Zugriffspfadstrukturen Seitenzuordnung Speicherzuordnung Externer Speicher Mengenorientierte Schnittstelle Satzorientierte Schnittstelle Interne Satzschnittstelle Speicherungsstrukturen Systempufferschnittstelle Dateischnittstelle Geräte schnittstelle Relationen, Sichten, Tupel Externe Sätze, Indexstrukturen Interne Sätze, Bäume, Hash Segmente, Seiten Dateien, Blöcke Spuren, Zylinder, Kanäle 14