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