prev up next

SQL-Scripte

Der MySQL-Server bietet eine prozedurale Erweiterung von SQL an, genannt SQL-Scripte oder auch Stored Procedures. Hiermit können SQL-Statements zu Prozeduren oder Funktionen zusammengefasst und ihr Ablauf durch Kontrollstrukturen gesteuert werden.

Sei eine Tabelle konto mit Kontonummern und Kontoständen angelegt durch

create table konto (nr int, stand int);

insert into konto values (1, 100);
insert into konto values (2, 100);
insert into konto values (3, 100);
Listing 7.2 zeigt eine benannte Stored Procedure, welche versucht, innerhalb der Tabelle konto eine Überweisung durchzuführen und danach das Ergebnis in zwei Tabellen festhält:
create table gebucht   (datum DATE, nr_1 int, nr_2 int, betrag int);
create table abgelehnt (datum DATE, nr_1 int, nr_2 int, betrag int);

Listing 7.2: stored procedure ueberweisung

Im Gegensatz zu einem konventionellen Benutzerprogramm wird eine stored procedure in der Datenbank gespeichert. Sie wird aufgerufen und (später) wieder entfernt durch

call ueberweisung (2, 3, 50);
drop procedure ueberweisung;

In Listing 7.3 wird eine Funktion f2c definiert, die eine übergebene Zahl als Temperatur in Fahrenheit auffasst und den Wert nach Celsius umrechnet.

Listing 7.3: stored function f2c

Der Aufruf der Funktion erfolgt innerhalb einer SQL-Abfrage

select f2c(122);

Oft besteht das Ergebnis eines Select-Statements aus einer variablen Anzahl von Tupeln. Diese können nacheinander verarbeitet werden mit Hilfe eines sogenannten Cursor. Listing 7.4 zeigt den typischen Einsatz in einer stored procedure.

Zunächst wird der Cursor durch declare mit einer SQL-Query assoziiert, welche die Professorennamen mit ihren Vorlesungstiteln ermittelt. Dann wird er mit open für die Abarbeitung geöffnet. Mittels fetch wird das nächste Tupel aus der Trefferliste geholt und mit into in lokalen Variablen abgespeichert. Ein continue handler überwacht, ob noch Tupel aus der SQL-Abfrage abzuarbeiten sind. Zum Abschluss wird der Cursor geschlossen und deallokiert.

Listing 7.4: Umgang mit einem Cursor


prev up next