prev up next

SQL-Scripte

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.

Listing 7.1: namenloses SQL-Script
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.

Listing 7.2: stored procedure ueberweisen
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.

Listing 7.3: stored function f2c
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


prev up next