360 likes | 546 Views
Vorlesung Datenbank-programmierung. 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
E N D
Vorlesung Datenbank-programmierung 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!
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é ??? Inhaltsübersicht Datenbankprogrammierung
Themen der Vorlesung (1) Zugriff auf Datenbanken Über sog. API‘s
Themen der Vorlesung (2) Zusatzprogramme innerhalb von Datenbanken • Stored Procedures • Stored Functions • Trigger
Beziehungen zu anderen Fächern Programmieren Objektorientierte Programmierung Datenbanksysteme eBusiness Client-Server Datenbankprogrammierung Objektorientierte Datenbanken Middleware Internet 2
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
Beispiel einer Terminal-Applikation(zentralisierte DB) • Warenwirtschaftssystem auf AS400
Fragestellung zu DB API‘s • Wie verwendet das Anwendungsprogramm die Funktionalität der Datenbank? • Wie findet der Datenaustausch zwischen Anwendung und Datenbank statt? • Wie wird eine Ergebnismenge der Datenbank an die Anwendung übergeben? • Zu welchem Zeitpunkt findet welche Aktion der Datenbank statt? • Wie kann man voll dynamische Abfragen an die Datenbank richten? • 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 Online-Datenkatalog (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. Relationen Objekte
Cursor Konzept • Zur Umgehung des Impedance Missmatch
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 createorreplacefunctionLeihe(resIDinnumber)returnvarchar2as varKundeIDNUMBER; varModellIDNUMBER; varBeginnDATE; varEndeDATE; varStartKmNUMBER; varKennzeichenCHAR(10); CURSORcurReservierungIS SELECTKundeID,ModellID,Beginn,Ende FROMReservierung WHEREID=resID;
Stored Procedures (8)Beispiel: Ausführungsteil BEGIN /* Reservierung mit der ReservierungsID holen */ OPENcurReservierung; FETCHcurReservierungINTOvarKundeID,varModellID,varBeginn,varEnde; /* Prüfen ob die abgerufene Reservierung mit dem heutigen Datum übereinstimmt */ ifto_char(varBeginn,'dd.mm.yyyy')=to_char(sysdate,'dd.mm.yyyy')then ifcurCar%rowcount<=0then return('Kein freies Auto !!!'); endif; /* Auto ist verfügbar – reserv. in leihe umwandeln, Eintrag in Leihvertrag einfügen */ InsertIntoleihvertrag(id,kundeid,autoid,beginn,ende,startkm) values(leihseq.nextval,varKundeID,varKennzeichen,varBeginn,varEnde,varStartKm); returnvarKennzeichen; else return('Reservierung ist nicht von Heute !!!!'); endif; END;
Stored Procedures (9)Beispiel: Ausnahmebehandlung • Benutzerdefinierte Ausnahmendeclare ausnahme1 exception; ... begin ... raise ausnahme1 ...exception when ausnahme1 then <aktion>end; • Daten-Ausnahmen (vordefiniert), z. B. when data_not_foundwhen max_open_cursors
Trigger (1)Aufbau Vergleichbar mit Stored Procedure CREATE[ORREPLACE]TRIGGER<trigger_name> {BEFORE|AFTER}{INSERT|DELETE|UPDATE} ON<table_name> [REFERENCING[NEWAS<new_row_name>][OLDAS <old_row_name>]] [FOREACHROW[WHEN(<trigger_condition>)]] <trigger_body>
Trigger (2)Beispiel: Deklarationsteil CREATETRIGGERmitarbeiter_trig_gehalt_biu BEFOREINSERTORUPDATEOFgehaltONmitarbeiter FOREACHROW -- 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<=5000ornew.gehalt<old.gehalt) DECLARE v_mitarbeiter_nameVARCHAR2(255):=null; -- Cursor holt "Name, Vorname" von Mitarbeitertabelle -- Explizite Definition des Cursors hat -- Performance-Vorteile gegen "select into <variable>" im Trigger-Body cursorc_nameis:selectname||', '||vorname frommitarbeiter wheremitarbeiternummer=:NEW.MITARBEITERNR;
Trigger (3)Beispiel: Ausführungsteil BEGIN -- Mitarbeiter-Name ermitteln und in Variable v_mitarbeiter_name speichern openc_name; fetchc_nameintov_mitarbeiter_name; closec_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<=5000THEN RAISE_APPLICATION_ERROR(-20901,'Manager Gehalt für Mitarbeiter‚ || v_mitarbeiter_name || ' zu klein!'); ENDIF; IF:NEW.GEHALT<:OLD_GEHALTTHEN RAISE_APPLICATION_ERROR(-20902,'Gehaltskürzung für Mitarbeiter‚ || v_mitarbeiter_name || ' nicht erlaubt!'); ENDIF; 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 ein Bridge Pattern • Vgl. Software-Engineering (Design-Pattern / Entwurfsmuster)