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