Stored Procedures in Datenbanken Was sind stored procedures? Gespeicherte Programmteile Datenbankobjekte Vom DB-Benutzer definiert Werden im DB-Server-Prozess ausgeführt Erweitern die Funktionalität des DBMS Wozu sind Stored Procedures gut? Erweiterung der Funktionalität von DBMSn Trigger wenn die Möglichkeiten von SQL nicht genügen u. wenn eine Verarbeitung am Server sinnvoller ist um die DB konsistent zu halten um mehr semantische Information zu definieren Methoden von Objekten bei objekt-relationalen DBn Wer bietet stored procedures? Große DBMS bieten Stored Procedures, z. B. IBM DB2 Microsoft SQL-Server Oracle Caché ... Stored Procedures werden nicht unterstützt von File-Server Datenbanken (z. B. Access) nicht kommerziellen Systemen (z. B. MySQL) Aufruf und Ablauf von Stored Procedures Client-Programm (z. B. JAVA, JDBC) ... CallableStatement cstmt = con.prepareCall ({?=CALL Reserv(?,?,?,?)}); cstmt.setInt(1, KundenID); ... cstmt.execute(); ... DB-Server Reserv(k integer, ...) begin if x > 10 then ... SELECT * FROM Tab2 ... ... INSERT INTO Reservierung ... ... end; Tab2 Tab1 Stored Procedures 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 bei Oracle: Aufbau Deklarationsteil Ausführungsteil Deklaration von Variablen, Cursor, Collections, ... Programmierung des Algorithmus Transaktionssteuerung Ausnahmebehandlung Reaktionen auf Fehler werden hier zusammengefasst Damit wird GOTO vermieden Beispiel Reservierung: Deklarationsteil create or replace function Reserv (kid integer, aid integer, von date, bis date) return integer as declare autozahl integer; z integer; tage integer; cursor c1 is Select * from Reservierung where ModellID = aid and ((Beginn >= von and Beginn <= bis) or (Beginn <= von and Ende >= von)); var_c c1%rowtype; Beispiel Reservierung: Ausführungsteil begin tage = bis - von; Select count(*) into autozahl from Auto where Modell = aid; For i in 0 .. tage loop z := autozahl; for var_c in c1 loop if von + i >= var_c.Beginn and von + i <= var_c.Ende then z := z - 1; end if; end loop; exit when z <= 0; end loop; if z <= 0 then return 0; else insert into Reservierung values (reservierungseq.nextval, kid, aid, von, bis); return 1; end if; end; / 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