WS 2015/16
Datenbanksysteme
Fr 17:00 – 18:30
R 1.008
Vorlesung #8
SQL (Teil 5)
WS 2015/16
Datenbanksysteme
Fr 17:00 – 18:30
R 1.008
„Fahrplan“
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
JDBC – Java Database Connectivity
SQLJ – Einbettung von SQL in Java
QBE – Query by Example
Datenbankanwendungen und Paradigmen
Fazit und Ausblick Vorlesung #9
© Bojan Milijaš, 20.11.2015
Vorlesung #8 - SQL (Teil 5)
2
Dynamische
Integritätsbedingungen
WS 2015/16
Datenbanksysteme
Fr 17:00 – 18:30
R 1.008
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š, 20.11.2015
Vorlesung #8 - SQL (Teil 5)
3
Trigger in Oracle Syntax
WS 2015/16
Datenbanksysteme
Fr 17:00 – 18:30
R 1.008
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š, 20.11.2015
Vorlesung #8 - SQL (Teil 5)
4
Trigger in Oracle Syntax (2)
WS 2015/16
Datenbanksysteme
Fr 17:00 – 18:30
R 1.008
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š, 20.11.2015
Vorlesung #8 - SQL (Teil 5)
5
Trigger in DB2 Syntax
© Bojan Milijaš, 20.11.2015
Vorlesung #8 - SQL (Teil 5)
WS 2015/16
Datenbanksysteme
Fr 17:00 – 18:30
R 1.008
6
WS 2015/16
Prozedurale Erweiterung von
Datenbanksysteme
Fr 17:00 – 18:30
R 1.008
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š, 20.11.2015
Vorlesung #8 - SQL (Teil 5)
7
WS 2015/16
Datenbanksysteme
Fr 17:00 – 18:30
R 1.008
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š, 20.11.2015
Vorlesung #8 - SQL (Teil 5)
8
WS 2015/16
Datenbanksysteme
Fr 17:00 – 18:30
R 1.008
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š, 20.11.2015
Vorlesung #8 - SQL (Teil 5)
9
WS 2015/16
Datenbanksysteme
Fr 17:00 – 18:30
R 1.008
© Bojan Milijaš, 20.11.2015
Vorlesung #8 - SQL (Teil 5)
10
WS 2015/16
Datenbanksysteme
Fr 17:00 – 18:30
R 1.008
© Bojan Milijaš, 20.11.2015
Vorlesung #8 - SQL (Teil 5)
11
Einbettung in Wirtssprachen
„Embedded SQL“
WS 2015/16
Datenbanksysteme
Fr 17:00 – 18:30
R 1.008
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š, 20.11.2015
Vorlesung #8 - SQL (Teil 5)
12
Einbettung in Wirtssprachen
„Embedded SQL“ (2)
WS 2015/16
Datenbanksysteme
Fr 17:00 – 18:30
R 1.008
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š, 20.11.2015
Vorlesung #8 - SQL (Teil 5)
13
Einbettung in Wirtssprachen
„Embedded SQL“ (3)
WS 2015/16
Datenbanksysteme
Fr 17:00 – 18:30
R 1.008
error:
exec sql whenever sqlerror continue;
exec sql rollback work release;
printf("fehler aufgetreten!\n");
exit(-1);
}
© Bojan Milijaš, 20.11.2015
Vorlesung #8 - SQL (Teil 5)
14
Datenbankanbindungen
WS 2015/16
Datenbanksysteme
Fr 17:00 – 18:30
R 1.008
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š, 20.11.2015
Vorlesung #8 - SQL (Teil 5)
15
WS 2015/16
Datenbanksysteme
Fr 17:00 – 18:30
R 1.008
© Bojan Milijaš, 20.11.2015
Vorlesung #8 - SQL (Teil 5)
16
WS 2015/16
Datenbanksysteme
Fr 17:00 – 18:30
R 1.008
© Bojan Milijaš, 20.11.2015
Vorlesung #8 - SQL (Teil 5)
17
WS 2015/16
Datenbanksysteme
Fr 17:00 – 18:30
R 1.008
© Bojan Milijaš, 20.11.2015
Vorlesung #8 - SQL (Teil 5)
18
WS 2015/16
Datenbanksysteme
Fr 17:00 – 18:30
R 1.008
© Bojan Milijaš, 20.11.2015
Vorlesung #8 - SQL (Teil 5)
19
WS 2015/16
Datenbanksysteme
Fr 17:00 – 18:30
R 1.008
© Bojan Milijaš, 20.11.2015
Vorlesung #8 - SQL (Teil 5)
20
Abgrenzung: Datenbanken vs.
Anwendungen
WS 2015/16
Datenbanksysteme
Fr 17:00 – 18:30
R 1.008
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š, 20.11.2015
Vorlesung #8 - SQL (Teil 5)
21
Wohin mir der Logik?
Datenbank oder Anwendung
WS 2015/16
Datenbanksysteme
Fr 17:00 – 18:30
R 1.008
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š, 20.11.2015
Vorlesung #8 - SQL (Teil 5)
22
WS 2015/16
Datenbanksysteme
Fr 17:00 – 18:30
R 1.008
Vorlesung #8
Ende