A FireBird SQL programozási nyelv

Vezérlési szerkezetek

Alapvető vezérlési szerkezetek

Szekvencia

FireBird blokkokban kizárólag lineáris végrehajtásra van lehetőségünk. A nyelv nem biztosít lehetőséget ugrásokra (GOTO). Maga az utasítássorozat -absztrakt szinten- a következőképpen néz ki:

< block> = BEGIN < compound_statement> [< compound_statement> �] END < compound_statement> = {< block> | statement;}

Az angol kifejezések önmagukért beszélnek. A FireBird fordító a blokkot tekinti egységnek. Egy blokk sohasem lehet teljesen üres, valamilyen utasításnak mindenképpen szerepelni kell benne. Ez a megkötés könnyen kijátszható a NULL utasítással, ami bár utasítás, de nem csinál semmit.

Egy FireBird blokk több másik FireBird blokkot is magában foglalhat, s a blokkok többszörös mélységben is egymásba ágyazhatók. A beágyazás gyakorlatilag tetszőleges mélységig folytatható. A hagyományos alprogramokhoz, eljárásokhoz szokott programozóknak feltűnhet, hogy a blokkok deklarálásánál hiányzik egy blokk azonosító. A FireBird rendszerben valóban nincs felhasználó által adott egyedi neve a blokkoknak. Ebből következően a blokkok önmagukban nem hívhatók meg más blokkokból. A FireBird blokkok igazából ritkán használatosak önmagukban, mindig valamilyen környezetben, más típusú objektumok (pl. tárolt eljárások, triggerek) részeként jelennek meg, melyeknek már van egyedi azonosító nevük, így a befoglaló objektumokon keresztül tudunk a tárolt blokkokra hivatkozni. A beágyazott blokk a külső blokk részeként kezelendő, így például a külső blokkban deklarált változók a beágyazott blokkban is láthatók lesznek. Függetlenségük megnyilvánulásának egyik példája, hogy bármelyik blokkban szerepelhet kivételkezelő rész, és ezek csakis arra a blokkra vannak hatással.

Példa:

SET TERM ^ ; CREATE PROCEDURE negyzet_plusz_egy (i SMALLINT) RETURNS (k INTEGER) AS BEGIN k=i*i; k=k+1; SUSPEND; END^ SET TERM ; ^
Elágazás

Feltételes végrehajtást a következő szintaktikával tudunk elérni:

IF (< condition>) THEN < compound_statement> [ELSE < compound_statement>]

Itt "condition" alatt természetesen a logikai kifejezést értjük, a "compound_statement" feljebb definiált. Amennyiben a feltétel hamis, úgy az esetlegesen megírt "ELSE" ágra ugrik a futás, ellenkező esetben egyszerűen csak nem hajtódik végre a "THEN" utáni utasítás(sorozat). Amennyiben egymásba ágyazott elágazásokra van szükségünk, úgy ezt a "compound_statement"-ként megadott újabb elágazás utasítással tudjuk elérni, külön utasítást erre nem ajánl fel a nyelv.

A feltétel részben a hagyományos operátorok, relációk mellett alkalmazhatók az SQL-ben megismert speciális operátorok is, mint az

  1. IS [NOT] NULL üres érték ellenőrzése
  2. [NOT] LIKE szövegkeresés minta alapján
  3. [NOT] BETWEEN értéktartományba esés
  4. [NOT] IN halmazban való előfordulás operátorok

Példa:

SET TERM ^ ; CREATE PROCEDURE logikait_stringesito (s1 VARCHAR(1)) RETURNS (s2 VARCHAR(4)) AS BEGIN IF (s1 IS NULL) THEN s2='' ELSE IF (s1='T') THEN s2='Igen' ELSE s2='Nem'; SUSPEND; END^ SET TERM ; ^
Ciklus

Ciklust két szemléletmód szerint hozhatunk létre Fireird-ben: adatbázis alapú ciklus (FOR SELECT ...) és logikai alapú ciklus (WHILE ... DO). Az első eset a -más adatbáziskezelőkben már megszokott- kurzorokhoz hasonlít. A második már elhatárolódik az adatbázistól, klasszikus elöltesztelős ciklusként foghatjuk fel. A FireBird nem biztosít nyelvi eszközt hátultesztelős ciklus írására, ezt kénytelenek vagyunk kézzel megoldani. (Például a ciklus magját megírjuk egy külön eljárásban, és az elöltesztelős ciklus indítása előtt egyszer lefuttatjuk az eljárást, valamint magába a ciklusmagba is csak az eljárásunkat hívjuk meg.) Létrehozhatunk végtenel ciklust is -értelemszerűen csak logikai alapú ciklusnál lehetséges-, ebből az EXIT kulcsszóval tudunk kilépni. Figyeljünk azonban arra, hogy az EXIT nem a blokk utolsó END utasítására lép, hanem az egész eljárást lezáró END utasításra!

Példa:

SET TERM ^ ; CREATE PROCEDURE elso_n_osszege (n SMALLINT) RETURNS (m INTEGER) AS BEGIN m=0; WHILE (n>0) DO BEGIN m=m+n; n=n-1; END; SUSPEND; END^ SET TERM ; ^