A FireBird SQL programozási nyelv

Alprogramok

Alprogramok

Általánosságok

A FireBird nyelv alapvető strukturális egysége a blokk. Az összetartozó blokkok durva közelítéssel megfeleltethetők a hagyományos programozási nyelven megírt eljárásoknak. A legfőbb hasonlósága az eljárással az, hogy a FireBird blokk is adatdefiníciós, majd azt követő műveleti részből áll, s a végrehajtás egységét jelenti. A különbség legfontosabb elemei, hogy itt szintaktikailag külön szerepel egy hibakezelő rész, s a blokkok egymásba is ágyazhatók, ahol a beágyazott blokk a műveleti vagy hibakezelő részben szerepelhet.

Teljesen mást takar viszont a függvényfogalom a FireBird-ben, mint azt várnánk. Maguknak az eljárásoknak létezik visszatérési értékük -amit maga a programozó definiálhat-, így az eljárások függvényként is funkcionálnak. A FireBird függvények (User Defined Function - UDF) szintaktikája, kezelési módja teljesen elhatárolódik az eljárásoktól, hogy mást ne említsek: egy UDF-et nem FireBird-ben írhunk meg, hanem mondjuk C-ben...

Eljárásokról bővebben

Egy eljárás létrehozásának szintaxisa a következő:

CREATE PROCEDURE name [( param datatype [, param datatype �])] [RETURNS ( param datatype [, param datatype �])] AS < procedure_body>; < procedure_body> = [< variable_declaration_list>] < block> < variable_declaration_list> = DECLARE VARIABLE var datatype; [DECLARE VARIABLE var datatype; �]

Természetesen van lehetőség egy eljárás későbbi megváltoztatására, az ALTER PROCEDURE kulcsszó felhasználásával.

A szintaxist bemutató ábrán jól elhatárolhatók az eljárás részei; a bevezető nyelvi utasítások, és azok kifejtése. Megfigyelhető az is, hogy a deklarációs rész nem kötelező, ellentétben az eljárástörzzsel, ahol szerepelnie kell utasításnak. A deklarációs részben a blokk saját, lokális változóit lehet megadni. A műveleti részben találhatók az SQL- és procedurális utasítások. Itt található továbbá a blokk hibakezelő része is, melyről bővebben később beszélek.

Blokkon belül az utasítások szeparálójele a ";". Ez némi következetlenségre vall, ugyanis a standard SQL utasítások szeparálójele is ez, így összemosódik az utasítások és maga az eljárás lezárójele. Ezt feloldandó, amikor deklarálunk egy eljárást, előtte átállítjuk az utasításvégjelet a SET TERM utasítás segítségével, majd az eljárás deklarációja után visszaállítjuk.

Példa: Konkrét példa a 2.5-ös szekcióban találhtató.

Függvényekről bővebben

Első pillantásra furcsának hangzik, hogy egy FireBird függvényt nem FireBird szintaxissal, sőt mi több, nem is FireBird-ben kell megírni. Láthattuk, hogy magát a függvényfogalmat a FireBird összemosta az eljárásokkal. Miért is történt ez?

Ha belegondolunk, akkor azonnal érthetővé válik. A FireBird utasításkészlete kicsi, lehetőségeink ezáltal erősen korlátozottak. FireBird-ben nem tudnánk megírni egy egyszerű "bináris vagy" műveletet sem. Ezért a nyelv kihasználja más nyelvek (C, Delphi) lehetőségeit.

A FireBird számos előre megírt UDF-et tartalmaz. Ezeket az "ib_udf.dll" és a "fbudf.dll" állományokban tárolja (az "ib_udf.dll" az InterBase-ből örökölt függvényeket tartalmazza).

Ha saját UDF-et szeretnénk létrehozni, akkor figyelembe kell venni a következőket:

  1. egy UDF-nek legfeljebb 10 bemeneti paramétere lehet, és pontosan egy kimeneti paramétere kell hogy legyen
  2. minden paraméternek alap FireBird típusnak kell lennie, nem lehet tömb típus
  3. az UDF-ek végén a lefoglalt memóriát ne felejtsük el felszabadítani

Egy UDF-et mindig hozzá kel adnunk az adatbázishoz. Ennek szintaxisa:

DECLARE EXTERNAL FUNCTION name [ datatype | CSTRING ( int) [, datatype | CSTRING ( int) ...]] RETURNS { datatype [BY VALUE] | CSTRING ( int)} [FREE_IT] [RETURNS PARAMETER n] ENTRY_POINT ' entryname' MODULE_NAME ' modulename';

Segítségképpen a FireBird installáláskor az UDF-eket tartalmazó dinamikus könyvtárai mellé odatesz egy szöveges file-t, ami a könyvtár függvényeinek deklarációit tartalmazza, így elég ezeket kimásolni, és az adatbázisban létrehozni a kívánt függvényt. A helpben is megtalálhatók a deklarációs utasítások, de vigyázzunk: a helpbe véletlenül szintaktikai hibásan kerültek bele a deklarációk nagy része!