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