 
                                WS 2011/12
Datenbanksysteme
Fr 15:15 – 16:45
R 0.006
Vorlesung #7
SQL (Teil 4)
„Fahrplan“
WS 2011/12
Datenbanksysteme
Fr 15:15 – 16:45
R 0.006
 Besprechung der Übungsaufgaben
 Einschub: „Self Joins“ (relevant fürs Praktikum)
 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 #8
© Bojan Milijaš, 18.11.2011
Dynamische
Integritätsbedingungen
WS 2011/12
Datenbanksysteme
Fr 15:15 – 16:45
R 0.006
 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š, 18.11.2011
Trigger in Oracle Syntax
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š, 18.11.2011
WS 2011/12
Datenbanksysteme
Fr 15:15 – 16:45
R 0.006
Trigger in Oracle Syntax (2)
WS 2011/12
Datenbanksysteme
Fr 15:15 – 16:45
R 0.006
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š, 18.11.2011
Trigger in DB2 Syntax
© Bojan Milijaš, 18.11.2011
WS 2011/12
Datenbanksysteme
Fr 15:15 – 16:45
R 0.006
WS 2011/12
Prozedurale Erweiterung von
Datenbanksysteme
Fr 15:15 – 16:45
R 0.006
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š, 18.11.2011
Oracle PL/SQL
WS 2011/12
Datenbanksysteme
Fr 15:15 – 16:45
R 0.006
 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š, 18.11.2011
Oracle PL/SQL (2)
WS 2011/12
Datenbanksysteme
Fr 15:15 – 16:45
R 0.006
 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š, 18.11.2011
WS 2011/12
Datenbanksysteme
Fr 15:15 – 16:45
R 0.006
© Bojan Milijaš, 18.11.2011
Oracle PL/SQL
WS 2011/12
Datenbanksysteme
Fr 15:15 – 16:45
R 0.006
 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š, 18.11.2011
Deklarativ vs. Prozedural (2)
© Bojan Milijaš, 18.11.2011
WS 2011/12
Datenbanksysteme
Fr 15:15 – 16:45
R 0.006
Deklarativ vs. Prozedural (3)
WS 2011/12
Datenbanksysteme
Fr 15:15 – 16:45
R 0.006
 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š, 18.11.2011
Cursor Beispiel (3)
WS 2011/12
Datenbanksysteme
Fr 15:15 – 16:45
R 0.006
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š, 18.11.2011
WS 2011/12
Datenbanksysteme
Fr 15:15 – 16:45
R 0.006
© Bojan Milijaš, 18.11.2011
Einbettung in Wirtssprachen
„Embedded SQL“
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š, 18.11.2011
WS 2011/12
Datenbanksysteme
Fr 15:15 – 16:45
R 0.006
Einbettung in Wirtssprachen
„Embedded SQL“ (2)
WS 2011/12
Datenbanksysteme
Fr 15:15 – 16:45
R 0.006
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š, 18.11.2011
Einbettung in Wirtssprachen
„Embedded SQL“ (3)
error:
exec sql whenever sqlerror continue;
exec sql rollback work release;
printf("fehler aufgetreten!\n");
exit(-1);
}
© Bojan Milijaš, 18.11.2011
WS 2011/12
Datenbanksysteme
Fr 15:15 – 16:45
R 0.006
Datenbankanbindungen
WS 2011/12
Datenbanksysteme
Fr 15:15 – 16:45
R 0.006
 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š, 18.11.2011
WS 2011/12
Datenbanksysteme
Fr 15:15 – 16:45
R 0.006
© Bojan Milijaš, 18.11.2011
WS 2011/12
Datenbanksysteme
Fr 15:15 – 16:45
R 0.006
© Bojan Milijaš, 18.11.2011
WS 2011/12
Datenbanksysteme
Fr 15:15 – 16:45
R 0.006
© Bojan Milijaš, 18.11.2011
WS 2011/12
Datenbanksysteme
Fr 15:15 – 16:45
R 0.006
© Bojan Milijaš, 18.11.2011
WS 2011/12
Datenbanksysteme
Fr 15:15 – 16:45
R 0.006
© Bojan Milijaš, 18.11.2011
Abgrenzung: Datenbanken vs.
Anwendungen
WS 2011/12
Datenbanksysteme
Fr 15:15 – 16:45
R 0.006
 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š, 18.11.2011
Wohin mir der Logik?
Datenbank oder Anwendung
WS 2011/12
Datenbanksysteme
Fr 15:15 – 16:45
R 0.006
 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š, 18.11.2011
WS 2011/12
Datenbanksysteme
Fr 15:15 – 16:45
R 0.006
Vorlesung #7
Ende