PL/SQL [PLSQL] ist eine prozedurale Erweiterung der deklarativen Abfragesprache SQL, es gibt zum Beispiel Schleifen und bedingte Verzweigungen, man hat aber keine Berechnungsvollständigkeit und keine Modularisierung.
PL/SQL erlaubt die Ausführung komplexer datenbankorientierter Operationen innerhalb des Datenbank-Servers, wobei die Kontrolle nicht nach jeder SQL-Anweisung an das Anwendungsprogramm zurückgegeben werden muß. Außerdem hat man eine einheitliche Sprache für alle Anwendungsprogramme und für die Administration des Datenbanksystems.
PL/SQL ist eine blockorientierte Sprache, wobei jeder Block aus einem optionalen Deklarationsteil (Variablen- und Konstantendeklarationen, explizite Cursor-Definitionen und benutzerdefinierte Ausnahmen), einem Ausführungsteil (dem eigentlichen Programm) und einem optionalen Fehler- und Ausnahmebehandlungsteil besteht.
Ein Cursor ist ein Verweis auf den privaten Arbeitsbereich einer SQL-Anweisung (private SQL area). Das Cursorkonzept ist eine Erweiterung von SQL, die in PL/SQL eingeführt wurde, um die zeilenweise Abarbeitung des Abfrageergebnisses zu ermöglichen. Ein Cursor kann implizit deklariert sein für DDL- und DML-Anweisungen einschließlich SELECT, die nur eine einzige Zeile liefern, oder explizit für mengenorientierte Abfragen, die mehr als eine Zeile liefern. Mit Aufrufen der Fetch-Operation wird der Cursor Datensatz für Datensatz über die Ergebnismenge bewegt. Man kann immer nur auf die Werte der Attribute des aktuellen Datensatzes zugreifen und hat folgende Möglichkeiten, den Status eines Cursors zu überprüfen: %FOUND ist TRUE, wenn die letzte FETCH-Operation einen Datensatz gefunden hat (analog dazu ist %NOTFOUND TRUE, wenn die letzte FETCH-Operation keinen Datensatz gefunden hat), %ROWCOUNT liefert die Anzahl der bereits gefundenen Datensätze und %ISOPEN ist TRUE, wenn der Cursor geöffnet ist.
Wie schon vorher erwähnt, gibt es in PL/SQL Kontrollstrukturen:
LOOP
...
[EXIT [WHEN condition]; ]
...
END LOOP;
FOR-Schleife
FOR counter IN [reverse] start .. end LOOP
...
END LOOP;
FOR-Cursor-Schleife
DECLARE
CURSOR curFor IS SELECT * FROM Friends ORDER BY lastName;
...
BEGIN
FOR c1Rec IN curFor LOOP
...
count := curFor%ROWCOUNT;
...
END LOOP;
nnnnnn¯
Unbedingte Schleife
Bei einer FOR-Cursor-Schleife wird implizit eine Datensatzstruktur gemäß der Cursor-Deklaration erstellt, der Cursor geöffnet, die Datensätze (einer nach dem anderen) aus der Datenbank in die Struktur übertragen und der Cursor nach Beenden der Schleife wieder geschlossen.
Ein kurzes Beispiel soll einen Eindruck geben, wie PL/SQL-Programme aussehen können.
CURSOR c1 IS SELECT * FROM Friends ORDER BY lastName;
c1Rec c1%ROWTYPE;
BEGIN
...
OPEN c1;
...
LOOP
FETCH c1 INTO c1Rec;
EXIT WHEN c1%NOTFOUND;
END LOOP;
...
count := c1%ROWCOUNT;
CLOSE c1;
...
END
nnnnnn¯
DECLARE