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...
Egy eljárás létrehozásának szintaxisa a következő:
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ó.
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:
Egy UDF-et mindig hozzá kel adnunk az adatbázishoz. Ennek szintaxisa:
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!