SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Vorlesung #9 SQL (Teil 4) SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 „Fahrplan“ Besprechung der Übungsaufgaben Einschub: CONSTRAINT Syntax Dynamische Intergritätsbedingungen, das „Trigger“Konzept von Oracle Prozedurale Erweiterungen, Beispiel Oracle PL/SQL Einbettung von SQL in Wirtssprachen, C, C++ ODBC – Open Database Connectivity ODBC – Java Database Connectivity SQLJ – Einbettung von SQL in Java QBE – Query by Example Datenbankanwendungen und Paradigmen Fazit und Ausblick Vorlesung #10 © Bojan Milijaš, 12.05.2004 Vorlesung #9 - SQL (Teil 4) 2 Einschub: Oracle „In Line“ CONSTRAINT- Syntax SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 [CONSTRAINT constraint_name] { [NOT] NULL | UNIQUE | PRIMARY KEY | references_clause | CHECK ( condition ) } [constraint_state] REFERENCES [schema .] { object_table | view } [ (column [, column]...) ] [ON DELETE { CASCADE | SET NULL }] [constraint_state] © Bojan Milijaš, 12.05.2004 Vorlesung #9 - SQL (Teil 4) 3 Dynamische Integritätsbedingungen SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Bedingungen an Zustandsänderungen bzw. Datenänderungen werden mittels Trigger überprüft. Man kann mit Triggern auch nachträgliche bzw. zusätzliche Berechnungen durchführen. CREATE TRIGGER – eigenständiger Datenbankobjekt der einer Tabelle zugeordnet wird, d.h. auf eine Tabelle „aufpasst“ Auslöser wird definiert (before update, for each row) Bedingungen gefolgt von Anweisungen © Bojan Milijaš, 12.05.2004 Vorlesung #9 - SQL (Teil 4) 4 Trigger in Oracle Syntax SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 create or replace trigger keineDegradierung before update on Professoren for each row when (old.Rang is not null) begin if :old.Rang = 'C3' and :new.Rang = 'C2' then :new.Rang := 'C3'; end if; if :old.Rang = 'C4' then :new.Rang := 'C4'; end if; if :new.Rang is null then :new.Rang := :old.Rang; end if; end; © Bojan Milijaš, 12.05.2004 Vorlesung #9 - SQL (Teil 4) 5 Trigger in Oracle Syntax (2) SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Vereinfacht – nur DML Events, man kann auch DDL abfangen CREATE [OR REPLACE] TRIGGER [schema .] trigger { BEFORE | AFTER | INSTEAD OF } { DELETE | INSERT | UPDATE [OF column [, column]...] } [FOR EACH ROW] [WHEN ( condition ) ] { pl/sql_block | call_procedure_statement } © Bojan Milijaš, 12.05.2004 Vorlesung #9 - SQL (Teil 4) 6 Trigger in DB2 Syntax © Bojan Milijaš, 12.05.2004 Vorlesung #9 - SQL (Teil 4) SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 7 SS 2004 Prozedurale Erweiterung von Datenbanken 4W Mi 13:30 – 15:00 G 2.30 SQL – Oracle PL/SQL Trigger waren bzw. sind bereits prozedural! Prozedurale Erweiterung ist notwendig Aus theoretischer Sicht – um TouringVollständigkeit zu erreichen Aus praktischer Sicht - um Probleme des Alltags, viel einfacher prozedural statt deklarativ zu lösen Hauptbegriff: Datenbank Cursor Dynamisches SQL in PL/SQL – würde hier den Rahmen sprengen © Bojan Milijaš, 12.05.2004 Vorlesung #9 - SQL (Teil 4) 8 SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Oracle PL/SQL Prozedurale Erweiterung von SQL Beispiel: Funktion Summe - rekursiv CREATE FUNCTION Summe1 (n INTEGER) RETURN INTEGER IS BEGIN IF n = 0 THEN return 0; ELSIF n = 1 THEN return 1; ELSIF n > 1 THEN return n + Summe1(n - 1); END IF; END; © Bojan Milijaš, 12.05.2004 Vorlesung #9 - SQL (Teil 4) 9 SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Oracle PL/SQL (2) nicht rekursiv nicht rekursiv, schlau FUNCTION Summe2(n INTEGER) RETURN INTEGER IS result INTEGER DEFAULT 0; v_n INTEGER DEFAULT n; BEGIN WHILE v_n >= 0 LOOP result := result + v_n; v_n := v_n - 1; END LOOP; return result; END; FUNCTION Summe3(n INTEGER) RETURN INTEGER IS BEGIN RETURN (n*(n+1))/2; END; © Bojan Milijaš, 12.05.2004 Vorlesung #9 - SQL (Teil 4) 10 SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 © Bojan Milijaš, 12.05.2004 Vorlesung #9 - SQL (Teil 4) 11 SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Oracle PL/SQL Beispiel: man verfügt über eine Tabelle (oder eine View über zwei Tabellen), die zu jedem Ort die zugehörige PLZ und das Bundesland beinhaltet Man möchte für jedes Bundesland PLZ Intervale bestimmen In SQL sehr umständlich, mit vielen „unsauberen“ Hilfskonstrukten Wie bringt aber man aber Daten aus einer Tabelle in eine prozedurale Sprache hinein? © Bojan Milijaš, 12.05.2004 Vorlesung #9 - SQL (Teil 4) 12 Deklarativ vs. Prozedural (2) © Bojan Milijaš, 12.05.2004 Vorlesung #9 - SQL (Teil 4) SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 13 Deklarativ vs. Prozedural (3) SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 PLZ Interval für jedes Bundesland Idee Sortiere nach PLZ Merke das Bundesland für die kleinste PLZ Bei jeder weiteren PLZ überprüfe ob sich das Bundesland geändert hat, d.h. vergleich das aktuelle Bundesland mit dem Bundesland des vorherigen Laufes Wenn ja, dokumentiere die Änderung Wiederhole bis zur größten PLZ Cursor-FOR oder Cursor-WHILE Schleife vorgestellt in der Vorlesung © Bojan Milijaš, 12.05.2004 Vorlesung #9 - SQL (Teil 4) 14 SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Cursor Beispiel (3) CURSOR c_orte is select PLZ, Land from orte order by PLZ ASC; lv_c_orte c_orte%ROWTYPE; BEGIN FOR lv_c_orte IN c_orte LOOP ... – Anweisungen, IT THEN ELSE usw. ... END LOOP; END; © Bojan Milijaš, 12.05.2004 Vorlesung #9 - SQL (Teil 4) 15 SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 © Bojan Milijaš, 12.05.2004 Vorlesung #9 - SQL (Teil 4) 16 Einbettung in Wirtssprachen „Embedded SQL“ SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Mit Hilfe eines Präcompilers!!! #include <stdio.h> exec sql begin declare section; varchar user_passwd[30]; int exMatrNr; exec sql end declare section; exec sql include SQLCA; main() { printf("Name/Password:"); scanf("%", user_passwd.arr); © Bojan Milijaš, 12.05.2004 Vorlesung #9 - SQL (Teil 4) 17 Einbettung in Wirtssprachen „Embedded SQL“ (2) SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 user_passwd.len=strlen(user_passwd.arr); exec sql wheneversqlerror goto error; exec sql connect :user_passwd; while (1) { printf("Matrikelnummer (0 zum beenden):"); scanf("%d", &ecMatrNr); if (!exMatrNr) break; exec sql delete from Studenten where MatrNr= :exMatrNr; } exec sql commit work release; exit(0); © Bojan Milijaš, 12.05.2004 Vorlesung #9 - SQL (Teil 4) 18 Einbettung in Wirtssprachen „Embedded SQL“ (3) SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 error: exec sql whenever sqlerror continue; exec sql rollback work release; printf("fehler aufgetreten!\n"); exit(-1); } © Bojan Milijaš, 12.05.2004 Vorlesung #9 - SQL (Teil 4) 19 Datenbankanbindungen SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 ODBC (Open Database Connecticity) Anbindung von Windows-Programmen Beispiel –Excel Zugriff auf Oracle JDBC (Java Database Connectivity) Eigentlich ein CLI Call-Level Interface SQLJ Echte Einbettung von SQL in Java, wie C, C++ Wichtig bei allen Schnittstellen: immer an die Voreinstellungen denken was passiert bei einem Fehler gibt es automatisch einen COMMIT oder ROLLBACK © Bojan Milijaš, 12.05.2004 Vorlesung #9 - SQL (Teil 4) 20 SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 © Bojan Milijaš, 12.05.2004 Vorlesung #9 - SQL (Teil 4) 21 SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 © Bojan Milijaš, 12.05.2004 Vorlesung #9 - SQL (Teil 4) 22 SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 © Bojan Milijaš, 12.05.2004 Vorlesung #9 - SQL (Teil 4) 23 SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 © Bojan Milijaš, 12.05.2004 Vorlesung #9 - SQL (Teil 4) 24 SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 © Bojan Milijaš, 12.05.2004 Vorlesung #9 - SQL (Teil 4) 25 Abgrenzung: Datenbanken vs. Anwendungen SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Marktbeherrschende Datenbanken beinhalten heute bereits Eingebaute und erweiterbare SQL Funktionen und Prozeduren als prozedurale Erweiterung XML und Java Standardschnittstellen zu jeder wichtigen Programmiersprache (Fortran, Cobol, C, C++) Eingebaute Funktionen für Volltextsuche, Geodaten, OLAP, Data Mining, Web usw. Objekte, benutzerdefinierte Datentypen Wo ist die Grenze zwischen einer Datenbank und einer „klassischen“ Anwendung? © Bojan Milijaš, 12.05.2004 Vorlesung #9 - SQL (Teil 4) 26 Wohin mir der Logik? Datenbank oder Anwendung SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Man entscheidet sich für die Datenbank Wenn man aus Performance-, Skalierbarkeit-, Sicherheitsoder Verfügbarkeitsgründen eine (bestimmte) Datenbank wählen muss Wenn man mit mehreren verschiedenen Anwendung gleichzeitig auf die Daten zugreifen möchte, so dass die Anwendungen „nur visualisieren“ und die Datenbank die Zugriffe und die Datenverarbeitung regelt Man entscheidet sich für die Anwendung Wenn man Datenbank-unabhängig bleiben möchte, d.h. die zugrundeliegende(n) Datenbank(en) lediglich als SQLDatenablage betrachtet Wenn eine Datenbankzentralisierung aus finanziellen oder technischen Gründen keinen Sinn macht © Bojan Milijaš, 12.05.2004 Vorlesung #9 - SQL (Teil 4) 27 Ausblick Vorlesung #10 und #11 SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Vorlesung #10 Relationale Theorie Funktionale Abhängigkeiten Schlüssel-Begriff Bestimmung von funktionalen Abhängigkeiten „Schlechte“ Relationenschemata Zerlegung von Relationen Vorlesung #11 Normalformen (1., 2., 3., 4., BCNF) Mehrwertige Abhängigkeiten © Bojan Milijaš, 12.05.2004 Vorlesung #9 - SQL (Teil 4) 28 SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Vorlesung #9 Ende