Microsoft SQL-Server 2000 bietet eine prozedurale Erweiterung von SQL an, genannt SQL-Scripte oder auch Stored Procedures. Hiermit können SQL-Statements zu namenlosen Blöcken, Prozeduren oder Funktionen zusammengefaßt und ihr Ablauf durch Kontrollstrukturen gesteuert werden.
Sei eine Tabelle konto mit Kontonummern und Kontoständen angelegt durch
create table konto (nr int, stand money)Listing 7.1 zeigt eine while-Schleife, die 50 Konten mit durchlaufender Numerierung einrichtet und alle Kontostände mit 0.0 initialisiert.
declare @i int -- lokale Variable @i set @i = 1 -- setze @i auf 1 while @i < 50 -- solange @i < 50 begin if (@i=42) insert into konto values (@i,200) -- fuege 200 DM ein else insert into konto values (@i, 0) -- fuege 0 DM ein set @i = @i+1 -- erhoehe @i end |
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
create table gebucht (datum DATE, nr_1 int, nr_2 int, betrag money) create table abgelehnt (datum DATE, nr_1 int, nr_2 int, betrag money)in Form einer Erfolgs- bzw. Mißerfolgsmeldung festhält.
create procedure ueberweisen -- lege Prozedur an
@x int, -- Konto-Nr. zum Belasten
@y int, -- Konto-Nr. fuer Gutschrift
@betrag money -- Ueberweisungsbetrag
as
declare @s money -- lokale Variable
SELECT @s = stand FROM konto -- hole Kontostand nach s
WHERE nr = @x -- von Konto-Nr. x
IF @s < @betrag BEGIN -- falls Konto ueberzogen
INSERT INTO abgelehnt -- notiere den Fehlschlag
VALUES (getdate(), @x, @y, @betrag) -- in der Tabelle abgelehnt
END ELSE
BEGIN
UPDATE konto -- setze in der Tabelle konto
SET stand = stand-@betrag -- neuen Betrag ein
WHERE nr = @x -- fuer Kontonr @x
UPDATE konto -- setze in der Tabelle konto
SET stand = stand+@betrag -- neuen Betrag ein
WHERE nr = @y -- fuer Kontonr @y
INSERT INTO gebucht -- notiere die Ueberweisung
VALUES (getdate(), @x, @y, @betrag) -- in der Tabelle gebucht
END
|
Im Gegensatz zu einem konventionellen Benutzerprogramm wird eine stored procedure in der Datenbank gespeichert. Sie wird aufgerufen und (später) wieder entfernt durch
execute ueberweisung 42,37,50 drop procedure ueberweisung
In Listing 7.3 wird eine Funktion f2c definiert, die eine übergebene Zahl als Temperatur in Fahrenheit auffaßt und den Wert nach Celsius umrechnet.
create function f2c -- definiere eine Funktion f2c (@fahrenheit int) -- Eingangsparameter vom Typ int returns int -- Ausgangsparameter vom Typ int as begin declare @celsius int -- lokale Variable set @celsius=(5.0/9.0)*(@fahrenheit-32) -- Umrechnung nach Celsius return @celsius; -- Rueckgabe des Funktionswertes end -- Ende der Funktion |
Der Aufruf der Funktion erfolgt innerhalb einer SQL-Abfrage unter Angabe des Besitzers (hier: dbo):
select temperatur, dbo.f2c(temperatur) from daten