Delphi - Folyamatvezérlés eszközei a Transact SQL-ben

Transact SQL 5. rész

forráskód letöltése
Mostani cikkünkben a Transact SQL nyelven belüli folyamatvezérlési lehetőségeket tekintjük át. Így például megtudhatjuk miként hozhatunk létre ciklust, feltételes elágazást, stb. 01.sql: while
Ciklus szervezésére a while kulcsszót használhatjuk. A while utáni utasítás, illetve a begin – end használata esetén a közrezárt utasítások annyiszor futnak le, ameddig a while után megadott feltétel teljesül.
Egy ciklust meg is szakíthatunk, ha a ciklusmagban használjuk a break kulcsszót. Ekkor a futás a ciklusmag utáni első sornál folytatódik.
A ciklusmag feldolgozását úgy is megszakíthatjuk, hogy az a whlie-nál folytatódva a következő ciklusba lépjen. Ehhez a continue kulcsszó használata szükséges.
declare @i int
declare @a int
select @i = 0
select @a = 1
while @i < 16 begin
  select @a = @a * 2
  select @i = @i + 1
end
select @a, power(2, 16)

02.sql: if
Feltételes elágazást az if utasítás valósít meg. Ha a megadott feltétel teljesül, akkor az if utáni sornál folytatódik a feldolgozás, ha nem akkor az if blokk utáni részen. Használhatunk else ágat is. Az itt megadott sorokra akkor kerül a vezérlés, ha az if-ben megadott feltétel nem teljesül. Több sor használata esetén azokat ne felejtsük el begin – end közé tenni.
if (select count(*) from categories) = 8
  select 'A Categories tábla 8 sort tartalmaz'
else
  select 'A Categories tábla nem 8 sort tartalmaz'

03.sql: goto
Ezt a példát ismét a Query Analizer-en keresztül futtassuk.
A goto segítségével egy tetszőleges helyre irányíthatjuk át a feldolgozást. Ehhez kell egy címkét elhelyezni a sorok között, mely egy tetszőleges szöveg lehet, kettősponttal zárva. Ezek után a goto kulcsszóval elvégezhetjük úgy az ugrást, hogy utána megadjuk annak a címkének a megnevezését, melyre ugrani szeretnénk.
declare @i int
select @i = 0
gotolabel:
if @i = 2
  select @i
else
  begin
    select @i = @i + 1
    goto gotolabel
  end

04.sql: case
Többszörös elágaztatásra képes a case. Egy kifejezést megadva annak eredménye alapján többféle eredményt szolgáltathat. Az egyes lehetséges értékeket a when kulcsszó után adhatjuk meg. Hogy mi legyen egy-egy ilyen esetben a visszatérési érték, azt a then kulcsszó után adhatjuk meg. Szükség esetén használhatunk itt is else ágat, melyre akkor kerül a vezérlés, ha egyetlen when után megadott érték sem felel meg a case után megadott kifejezés értékének.
A case utasítást egy end-el kell zárnunk.
SET DATEFIRST 1
select 'Hét napja' =
  case datepart(weekday, GetDate())
    when 1 then 'Hétfo'
    when 2 then 'Kedd'
    when 3 then 'Szerda'
    when 4 then 'Csütörtök'
    when 5 then 'Péntek'
    when 6 then 'Szombat'
    when 7 then 'Vasárnap'
  end

05.sql: case
A case használatával arra is lehetőségünk nyílik, hogy a when után ne egy konstans értéket adjunk meg, hanem egy kifejezést. Ebben az esetben nincs szükség arra, hogy a case szó után álljon a kifejezés. Ilyenkor amelyik when feltétel teljesül, az ahhoz tartozó then utáni érték kerül visszaadásra.

Az alábbi lekérdezéssel három csoportba oszthatjuk a termékeket az áraik alapján.
SELECT ProductName, UnitPrice, 'Ár kategória' =
  CASE
    WHEN UnitPrice < 10 then 'olcsó'
    WHEN UnitPrice >= 10 and UnitPrice <= 30 THEN 'átlagos'
    WHEN UnitPrice > 30 THEN 'drága'
  END
FROM products

06.sql: case
Az előbbi példát tovább bonyolítva készíthetünk olyan lekérdezést is, melyben megszámlálhatjuk, hogy a három létrehozott csoportba hány termék kerül.
SELECT 'Ár kategória' =
  CASE
    WHEN UnitPrice < 10 then 'olcsó'
    WHEN UnitPrice >= 10 and UnitPrice <= 30 THEN 'átlagos'
    WHEN UnitPrice > 30 THEN 'drága'
  END,
  count(*) as 'Darab'
FROM products
group by CASE
    WHEN UnitPrice < 10 then 'olcsó'
    WHEN UnitPrice >= 10 and UnitPrice <= 30 THEN 'átlagos'
    WHEN UnitPrice > 30 THEN 'drága'
  END

07.sql: waitfor
Lehetőségünk van arra is, hogy várakoztassuk a feldolgozást egy adott időtartamig, vagy egy adott időpontig.
Ha a waitfor kulcsszó után a delay kulcsszót használjuk, akkor megadhatunk egy időtartamot, melynek leteltéig nem folytatódik a feldolgozás.
Ha a waitfor kulcsszó után a time kulcsszót használjuk, akkor megadhatunk egy időpontot, melynek bekövetkeztéig nem folytatódik a feldolgozás. Itt megadhatunk egy datetime típust, de ebből csak az időpont része lesz figyelembe véve, a dátum nem.
waitfor delay '00:00:03'
select 'A három másodperc letelt'


Transact SQL cikksorozat