1_Einleitung_05

advertisement
Vorlesung Datenbankprogrammierung
Wintersemester 06/07
Dipl.-Ing.(FH) David Schiffer
Nicht verwandt!
Organisation
Erst 3 x Vorlesung, dann Übungen
 Übungen am Rechner
 2 Gruppen, abwechselnd 2 wöchentlich
 Übungsteams von 2 bis 3 Studenten
 Schein für Lösungen der Übungsaufgaben
 ca. 3 Übungsaufgaben im Semester
 Kontrolle durch Vorführen
 Wer will, kann alle Übungen in der 1.
Übungsstunde vorführen

Regeln
Wer Fragen hat fragt
 Wer quatschen will quatscht
Aber draußen


Um den Schein zu bestehen müssen:
 ALLE
Übungen vorgeführt werden!
 ALLE Übungen verstanden sein!
Inhaltsübersicht
Datenbankprogrammierung

Einleitung



Beziehung zu anderen
Fächern
 Client-Server Prinzip

Anwendungsentwicklung:
Zugriff auf DBn, APIs





JDBC
ADO.NET
embedded SQL
ODBC
Proprietäre
Datenbankschnittstellen
Zusatzprogramme in DB
Stored Procedures
 Functions
 Trigger

Objekt-relationale DBn



+
Methoden
Oracle 9i
Evtl. Caché
verwendete Datenbanken
-
-
Oracle
MySQL ?
DB2 ?
Access ???
Caché ???
Themen der Vorlesung (1)
Zugriff auf Datenbanken
Über sog. API‘s
Themen der Vorlesung (2)
Zusatzprogramme innerhalb von Datenbanken
•Stored Procedures
•Stored Functions
•Trigger
Motivation für Datenbankprogrammierung
Beziehungen zu anderen Fächern
Programmieren
Datenbanksysteme
Objektorientierte
Programmierung
Client-Server
Datenbankprogrammierung
Internet 2
Objektorientierte
Datenbanken
Middleware
eBusiness
Bestandteile einer DB-Anwendung

Schichten-Modell
 Die
Benutzerschnittstelle.
 Die Anwendungs- / Geschäftslogik.
 Die Datenbank-Schnittstelle.
 Die Vermittlungssoftware.
 Das Datenbank-Management-System.
 Der Datenspeicher
Datenbank Architekturen
Zentralisierte Datenbank-Systeme
 Client-Server-Datenbanken
 Desktop-Datenbanken
 3-Tier (Multitier) -Architektur

Zentralisierte DB & Client-Server
Beispiel einer Terminal-Applikation
(zentralisierte DB)

Warenwirtschaftssystem auf AS400
3-Tier Architektur
Multitier => SOA
Fragestellung zu DB API‘s
1) Wie verwendet das Anwendungsprogramm die
Funktionalität der Datenbank?
2) Wie findet der Datenaustausch zwischen Anwendung
und Datenbank statt?
3) Wie wird eine Ergebnismenge der Datenbank an die
Anwendung übergeben?
4) Zu welchem Zeitpunkt findet welche Aktion der
Datenbank statt?
5) Wie kann man voll dynamische Abfragen an die
Datenbank richten?
6) Welche Art von Kopplung entsteht zwischen
Anwendungsprogramm und Datenbank?
Coddschen Regeln (1)






Regel 1: The Information Rule (Darstellung von
Informationen):
Regel 2: Guaranteed Access Rule (Zugriff auf Daten):
Regel 3: Systematic Treatment of Null Values
(Systematische Behandlung von Nullwerten):
Regel 4: Dynamic On-line Catalog Based on the
Relational Model (Forderung nach einem OnlineDatenkatalog (data dictionary) in Form von Tabellen):
Regel 5: Comprehensive Data Sublanguage Rule
(Abfragesprache):
Regel 6: View Updating Rule (Aktualisierung von
Sichten):
Coddschen Regeln (2)






Regel 7: High-level Insert, Update, and Delete (Abfragen
und Bearbeiten ganzer Tabellen):
Regel 8: Physical Data Independence (Physikalische
Datenunabhängigkeit):
Regel 9: Logical Data Independence (Logische
Datenunabhängigkeit):
Regel 10: Integrity Independence (Unabhängigkeit der
Integrität):
Regel 11: Distribution Independence
(Verteilungsunabhängigkeit):
Regel 12: Nonsubversion Rule (Kein Unterlaufen der
Abfragesprache):
Impedance Missmatch
vs.
Objekte
Relationen
Cursor Konzept

Zur Umgehung
des Impedance
Missmatch
Verarbeitung einer SQL-Abfrage
Stored Procedures (1)
Was sind SP‘s?

Gespeicherte Programmteile

Datenbankobjekte

Vom DB-Benutzer definiert

Werden im DB-Server-Prozess ausgeführt

Erweitern die Funktionalität des DBMS
Stored Procedures (2)
Wozu dienen SP‘s?

Erweiterung der Funktionalität von DBMSn
 wenn
die Möglichkeiten von SQL nicht genügen u.
 wenn eine Verarbeitung am Server sinnvoller ist

Trigger
 um
die DB konsistent zu halten
 um mehr semantische Information zu definieren

Methoden von Objekten
 bei
objekt-relationalen DBn
Stored Procedures (3)
Wer bietet SP‘s?
Große DBMS bieten Stored Procedures, z. B.


IBM DB2

Microsoft SQL-Server, Sybase

Oracle

Caché

PostgreSQL, MySQL (eingeschränkt seit Version 5)

...
Stored Procedures werden nicht unterstützt von


File-Server Datenbanken (z. B. Access)
Stored Procedures (4)
Wann SP‘s (nicht) verwenden?
Nur dann, wenn nur 1 DBMS-Typ unterstützt
werden muss

SP‘s können Performance bringen

SP‘s können zur Entkopplung der Anwendung von
der DB-Struktur genutzt werden


Besser: DAO-Schicht einführen
Die Verwendung von SP‘s ist eine grundsätzliche
Designentscheidung - und eine Glaubensfrage

Stored Procedures (5)
Bei Oracle
Programmiersprache PL/SQL
C, C++ und JAVA sind auch möglich
PL/SQL ist typenstrenge Programmiersprache
Cursor verbinden SQL mit prozeduraler
Verarbeitung
Besondere Konstrukte für Datenzugriff

for cursor loop
Datensatztyp-Deklaration
Collection-Typen

Stored Procedures (6)
Bei Oracle - Aufbau
Deklarationsteil


Deklaration von Variablen, Cursor, Collections, ...
Ausführungsteil

Programmierung des Algorithmus
Transaktionssteuerung

Ausnahmebehandlung

Reaktionen auf Fehler werden hier zusammengefasst
Damit wird GOTO vermieden

Stored Procedures (7)
Beispiel: Deklarationsteil
create or replace function Leihe (resID in number) return varchar2 as
varKundeID
NUMBER;
varModellID NUMBER;
varBeginn
DATE;
varEnde
DATE;
varStartKm
NUMBER;
varKennzeichen CHAR(10);
CURSOR curReservierung IS
SELECT KundeID, ModellID, Beginn, Ende
FROM Reservierung
WHERE ID = resID;
Stored Procedures (8)
Beispiel: Ausführungsteil
BEGIN
/* Reservierung mit der ReservierungsID holen */
OPEN curReservierung;
FETCH curReservierung INTO varKundeID, varModellID, varBeginn, varEnde;
/* Prüfen ob die abgerufene Reservierung mit dem heutigen Datum übereinstimmt */
if to_char(varBeginn,'dd.mm.yyyy')=to_char(sysdate,'dd.mm.yyyy') then
if curCar%rowcount <= 0 then
return ('Kein freies Auto !!!');
end if;
/* Auto ist verfügbar – reserv. in leihe umwandeln, Eintrag in Leihvertrag einfügen */
Insert Into leihvertrag (id, kundeid, autoid, beginn, ende, startkm)
values(leihseq.nextval, varKundeID, varKennzeichen, varBeginn, varEnde,
varStartKm);
return varKennzeichen;
else
return ('Reservierung ist nicht von Heute !!!!');
end if;
END;
Stored Procedures (9)
Beispiel: Ausnahmebehandlung
Benutzerdefinierte Ausnahmen

declare ausnahme1 exception; ...
begin ... raise ausnahme1 ...
exception
when ausnahme1 then <aktion>
end;
Daten-Ausnahmen (vordefiniert), z. B.

when data_not_found
when max_open_cursors
Trigger (1)
Aufbau
Vergleichbar mit Stored Procedure
CREATE [OR REPLACE] TRIGGER <trigger_name>
{BEFORE|AFTER} {INSERT|DELETE|UPDATE}
ON <table_name>
[REFERENCING [NEW AS <new_row_name>] [OLD AS <old_row_name>]]
[FOR EACH ROW [WHEN (<trigger_condition>)]]
<trigger_body>
Trigger (2)
Beispiel: Deklarationsteil
CREATE TRIGGER mitarbeiter_trig_gehalt_biu
BEFORE INSERT OR UPDATE OF gehalt ON mitarbeiter
FOR EACH ROW
-- Triggername mitarbeiter_trig_gehalt_biu (_biu steht für B-efore I-nsert U-pdate )
-- Tabelle: MITARBEITER
-- Trigger soll nur ziehen, wenn Gehalt kleiner 5000 ist oder Neues Gehalt kleiner altem Gehalt
-- in der folgenden WHEN erfolgt der Zugriff auf :old und :new OHNE vorangestellte :
WHEN (new.gehalt <= 5000 or new.gehalt < old.gehalt)
DECLARE
v_mitarbeiter_name VARCHAR2(255):=null;
-- Cursor holt "Name, Vorname" von Mitarbeitertabelle
-- Explizite Definition des Cursors hat
-- Performance-Vorteile gegen "select into <variable>" im Trigger-Body
cursor c_name is :select name||', '||vorname
from mitarbeiter
where mitarbeiternummer = :NEW.MITARBEITERNR;
Trigger (3)
Beispiel: Ausführungsteil
BEGIN
-- Mitarbeiter-Name ermitteln und in Variable v_mitarbeiter_name speichern
open c_name;
fetch c_name into v_mitarbeiter_name;
close c_name;
-- Bei Gehalt kleiner 5000 Exception auslösen
--> Fehler wird in der Regel bis zur Anwendung hochgereicht
-- Exception-Nr -20000 - -29999 können selbst definiert werden
IF :NEW.GEHALT <= 5000 THEN
RAISE_APPLICATION_ERROR(-20901,'Manager Gehalt für Mitarbeiter‚
|| v_mitarbeiter_name || ' zu klein!');
END IF;
IF :NEW.GEHALT < :OLD_GEHALT THEN
RAISE_APPLICATION_ERROR(-20902,'Gehaltskürzung für Mitarbeiter‚
|| v_mitarbeiter_name || ' nicht erlaubt!');
END IF;
END;
Embedded-SQL Beispiel
#include <stdio.h>
EXEC SQL INCLUDE SQLCA;
void main( void ) {
EXEC SQL BEGIN DECLARE SECTION;
char Author[81];
char Title[81];
char ISBN[14];
EXEC SQL END DECLARE SECTION;
EXEC SQL CONNECT TO "azamon" USER "dba" IDENTIFIED BY "sql";
strcpy( ISBN, "0-87930-480-4" );
EXEC SQL SELECT Author, Title, ISBN
INTO :Author, :Title, :ISBN
FROM Books
WHERE ISBN = :ISBN;
printf( "%s: %s ISBN %s\n", Author, Title, ISBN );
EXEC SQL DISCONNECT ALL;
}
ODBC abstrahiert proprietäre API‘s

proprietär
ODBC abstrahiert proprietäre API‘s

ODBC
ODBC ein Bridge Pattern

Vgl. Software-Engineering (Design-Pattern /
Entwurfsmuster)
Herunterladen