8.1 PL/SQL
Beispiel:
PROCEDURE ueberweisen( x NUMBER, y NUMBER, betrag NUMBER) IS
s konto.kontostand%TYPE; - - Deklarationsteil
BEGIN
SELECT kontostand INTO s FROM konto
WHERE kontonr = x FOR UPDATE OF kontostand;
IF s < betrag THEN
INSERT INTO abgelehnt VALUES (SYSDATE,x,y,betrag);
ELSE
s := s-betrag;
UPDATE konto
SET kontostand = s WHERE kontonr = x;
UPDATE konto
SET kontostand = kontostand+betrag WHERE kontonr = y;
INSERT INTO gebucht
VALUES (SYSDATE,x,y,betrag);
END IF;
COMMIT;
END;
PL/SQL
[ DECLARE ....]
BEGIN
..... - - Anweisungen
[ EXCEPTION ..... ]
END;
PL/SQL Deklarationsteil:
PL/SQL Anweisungen: Zuweisungen, IFs, Schleifen, Anfragen, Updates, Prozedur- und Funktionsaufrufe, Cursor-Funktionen
IF a<b THEN.... - - Anweisungen
END IF;
IF a=c THEN .....
ELSIF ......
ELSE .....
END IF;
PL/SQL Forts. Anweisungen:
LOOP
.....
END LOOP;
in Verbindung mit EXIT; bzw. EXIT WHEN bed.; zum Herausspringen aus der Schleife
zaehler wird automatisch inkrementiert
....
GOTO label1;
....
<<label1>>
...
PL/SQL Forts. Anweisungen:
SELECT attr1,... [ INTO var1 ]
FROM relation
WHERE bedingung [ FOR UPDATE OF attr1];
FOR UPDATE-Angabe bewirkt Sperren der Tabelle,
INTO..-Angabe bei nur einem Ergebnistupel, welches sofort einer Variablen zugeordnet
wird (bei mehreren Ergebnistupeln: Cursor benutzen)
INSERT INTO relation VALUES (...);
UPDATE relation SET ..... WHERE bedingung;
DELETE FROM relation WHERE bedingung;
PL/SQL Forts. Anweisungen:
DECLARE
CURSOR c1 IS SELECT * FROM artikel;
art artikel%ROWTYPE;
BEGIN
...
OPEN c1; - - jetzt erst wird die Anfrage ausgeführt
...
FETCH c1 INTO art; - - holt (nächstes) Ergebnistupel der Anfrage, z.B. in LOOP
...
CLOSE c1; - - schließ t Cursor, Anfrageergebnis nicht mehr vorhanden
Erneutes OPEN nach CLOSE stellt Anfrage neu
PL/SQL
Forts. Anweisungen:
CREATE PROCEDURE auftr_numerieren IS
i NUMBER(6);
auftr auftrag%ROWTYPE;
CURSOR c IS SELECT * FROM auftrag FOR UPDATE; - - mit Locking
BEGIN
i := 1;
OPEN c;
LOOP
FETCH c INTO auftr;
EXIT WHEN c%NOTFOUND;
UPDATE auftrag SET auftrnr = i WHERE CURRENT OF c;
i := i + 1;
END LOOP;
CLOSE c;
END;
PL/SQL Exceptions
...
EXCEPTION
WHEN NO_DATA_FOUND THEN
...- - eigene Anweisungen
WHEN TOO_MANY_ROWS THEN
... - - eigene Anweisungen
WHEN OTHERS THEN
... - - eigene Anweisungen
NO_DATA_FOUND, TOO_MANY_ROWS, LOGIN_DENIED, NOT_LOGGED_ON,
CURSOR_ALREADY_OPEN,
INVALID_CURSOR, INVALID_NUMBER,
DUP_VAL_ON_INDEX, ROWTYPE_MISMATCH,
STORAGE_ERROR, TIMEOUT_ON_RESOURCE,
VALUE_ERROR, PROGRAM_ERROR, ZERO_DIVIDE
PL/SQL Forts. Exceptions
DECLARE
my_except EXCEPTION;
...
...
IF (a=0) RAISE my_except;
...
WHEN my_except THEN anweisungen;
PL/SQL Aufbau Funktion:
FUNCTION fktname [ (par1,...)] RETURN typ IS
[lokale Deklarationen ]
BEGIN
....- - Anweisungen, darunter mind. eine der Art:
RETURN wert;
[EXCEPTION......]
END;
parametername [ IN | OUT | IN OUT] typ [ := expr | DEFAULT expr]
voreingestellt: IN, DEFAULT-Angabe nur bei IN erlaubt
FUNCTION erhoehe_gehalt (prozent REAL DEFAULT 1.5)
RETURN REAL - - hoechstes Gehalt soll zurueckgegeben werden..
IS
hoechstes REAL; -- lokale Deklaration
BEGIN
UPDATE angestellter
SET gehalt = gehalt + (prozent*gehalt/100);
COMMIT; - - Transaktion beenden, Änderung dauerhaft machen
SELECT max(gehalt) INTO hoechstes
FROM angestellter;
RETURN hoechstes;
END;
PL/SQL Aufbau Prozedur:
PROCEDURE pname [(par1,...)] IS
[lokale Deklarationen ]
BEGIN
.... - -Anweisungen
[EXCEPTION .....]
END;
Jutta Goeers