A FireBird SQL programozási nyelv

Típusok, típuskonstrukciók

Típusok leírása

FireBird-ben minden változónak rendelkezni kell típussal. Sőt, minden változónak definiáltnak kell lennie a használat előtt, ellenkező esetben az értéke NULL, mely definiálatlant jelent minden típus esetében. A NULL értékre nem alkalmazhatók összehasonlítások, valamint a beépített függvények általában nem fogadnak el NULL értéket, mint paramétert.

A nyelv -tekintve, hogy az SQL nyelv kiterjesztése, és így szükségszerűen támogatja a natív SQL típusok használatát- meglehetősen nagy számú beépített adattípussal rendelkezik. A táblázat mutatja a lehetséges típusok csoportjait.

Típus
Név
Méret
Tartomány
Egész SMALLINT
16 bit
-32 768 - 32 768
  INTEGER
32 bit
-2 147 483 648 - 2 147 483 648
Valós FLOAT
32 bit
1,175*10e-38 - 3,402*10e38
  DOUBLE PRECISION
64 bit
2,225*10e-308 - 1,797*10e308
Fixpontos DECIMAL(precision,scale)
16 vagy 32 vagy 64 bit
Minimális számjegymennyiség adható meg (precision)
  NUMERIC(precision,scale)
16 vagy 32 vagy 64 bit
Konkrét számjegymennyiség adható meg (precision)
Idő DATE
64 bit
100. január 1. - 32768. február 29.
  TIME
64 bit
100. január 1. - 32768. február 29.
  TIMESTAMP
64 bit
100. január 1. - 32768. február 29.
Szöveg CHAR(n)
1-32767 byte
Pontosan n hosszúságú karakterlánc
  VARCHAR(n)
1-32765 byte
Maximum n hosszúságú karakterlánc
LOB BLOB
-
Bináris, szegmensméret: 64K

A fixpontos típusok valójában származtatott típusok, mely származtatást a következő táblázat tartalmazza (3-as SQL dialektus esetén):

Precízió
Típus
1-4
SMALLINT
5-9
INTEGER
10-18
DOUBLE PRECISION

Referencia típusokat nem áll módunkban használni FireBird-ben. Szöveges típusok esetén mindig megadható, hogy a változó milyen karakterkészletet (Character Set) használjon, és azon belül milyen összehasonlítási sémát (Collation Order). Előbbit az adatbázis létrehozásakor kell meghatározni, utóbbit táblaszinten is megadhatjuk, illetve értelmezhetjük lokális változókra is. A lehetséges rendezések listája a helpben megtalálható. Példa:

CREATE TABLE tabla_nev(mezo_nev VARCHAR(20) COLLATE pxw_hundc);
Típuskonverziók

FireBird alatt kétfajta típuskonverziót különböztetünk meg:

  1. Implicit konverzió
  2. Explicit konverzió

Az implicit konverzió a FireBird azon beépített mechanizmusát takarja, melyben a rendszer saját maga felismeri a konverzió szükségességét, és automatikusan végre is hajtja azt. Amennyiben ez nem sikerül, úgy kivétel generálódik. Példa:

  1. Implicit konverzióra: 1 + '2' = 3
  2. Kivételt generáló implicit konverzióra: 1 + 'a' = 3
  3. Az explicit konverzió a programozó eszköze. Abban az esetben használandó, amikor a rendszer nem konvertálná az adatot automatikusan, azaz nem alkalmazza az implicit konverziót. Ez a funkció a CAST kulcszsóval érhetó el. Szintaxisa: CAST ( value | NULL AS datatype) A lehetséges konverziókat a következő táblázat tartalmazza:

    Mit konvertálunk
    Mire konvertálunk
    DATE, TIME, TIMESTAMP CHAR, VARCHAR
    CHAR, VARCHAR DATE, TIME, TIMESTAMP
    TIMESTAMP TIME, DATE
    TIME, DATE TIMESTAMP
    NUMERIC types CHAR, VARCHAR

    Minden esetben, amikor a CAST aktuális paraméterei alapján a konverzió nem elvégezhető, kivétel generálódik. Példa: Egy példa az aktuális dátum -TIMESTAMP típusú- konvertálására DATE típusúra: CAST('now' as DATE)

    Azonosítók, változók, kifejezések

    FireBird-ben az azonosítók legfeljebb 31 karakter hosszúak lehetnek (Constraint-ek esetében ez a szám csak 27). A kezdő karakter kötelezően betű, a továbbiakban számok, betűk és speciális jelek (_, $) váltakozva követhetik egymást. A FireBird nem tesz különbséget a kis- és nagybetűk között. Az objektumok neveinek globálisan egyedieknek kell lenniük az adatbázisban. Amennyiben egy objektum nevének a FireBird valamelyik kifejezését (Reserved word) szeretnénk használni, abban az esetben kettős aposztrofokba (" ... ") kell foglalnunk a nevet.

    A változókat használatuk előtt deklarálni kell.

    Szintaxis: DECLARE VARIABLE valtozo_nev datatype; Egy változót inicializálnunk kell. Ez nem történik meg automatikusan, minden változó a deklarálás után a NULL értéket veszi fel. Egy változónak a '=' operátorral adhatunk értéket az őt deklaráló eljárás törzsében. FireBird alatt nincs lehetőségünk konstansokat létrehozni, egy objektum konstans voltát nekünk kell biztosítanunk.

    Precedencia

    Az operátorokat, és azok precedenciáját ábrázolja a következő négy táblázat:

    Precedencia-szint
    Típus
    1.
    Szöveges
    2.
    Matematikai
    3.
    Összehasonlítás
    4.
    Logikai

    Matematikai
    Precedencia-szint
    Típus
    1.
    *
    2.
    /
    3.
    +
    4.
    -

    Összehasonlító
    Precedencia-szint
    Típus
    1.
    =
    2.
    <>,!=
    3.
    >
    4.
    <
    5.
    <=
    6.
    <=

    Logikai
    Precedencia-szint
    Típus
    1.
    NOT
    2.
    AND
    3.
    OR

    Az összehasonlító operátorokhoz még hozzávehetők:

    1. ALL
    2. ANY
    3. BETWEEN
    4. CONTAINING
    5. EXISTS
    6. IN
    7. LIKE
    8. NULL
    9. SINGULAR
    10. SOME
    11. STARTING WITH

    Ezek precedenciájának jellemzője, hogy a szerver akkor hajtja végre őket balról jobbra sorrendben, amikor már semmilyen operátorral nem kerülhet összetűzésbe (conflict).

    FireBird blokkban kiadható utasítások

    Utasítás
    Leírás
    BEGIN ... END Blokk határoló
    DECLARE VARIABLE ... Deklaráció
    /* ... */ Komment
    = Értékadás
    SELECT ... FROM ... INTO ... Lekérdezés az adatbázisból (SQL utasítás)
    FOR SELECT ... FROM ... INTO ... BEGIN ... END Automatikus kurzorlétrehozás az eredményhez
    INSERT Adat beszúrása az adatbázisba (SQL utasítás)
    UPDATE Adatok módosítása az adatbázisban (SQL utasítás)
    DELETE Adat törlése az adatbázisból (SQL utasítás)
    IF ... THEN ... ELSE ... Feltételes elágazás
    WHILE ... DO BEGIN ... END Elöltesztelős ciklus
    EXCEPTION ... Adott kivétel dobása
    EXECUTE PROCEDURE ... Eljáráshívás
    EXIT Kilépés a teljes eljárásból
    NULL Üres utasítás
    SUSPEND Egy sornyi visszatérési érték elküldése
    WHEN ... DO BEGIN ... END Kivételkezelő utasításrész

    Az egyes műveletek végrehajtását számtalan segédfüggvény segíti, melyekkel többek között numerikus, karakterkezelési, dátumkezelési és konverziós műveletek végezhetők. Az utasítások felsorolásából is látszik, hogy a FireBird a külvilág felé zárt, csak az adatbázisban tárolt adatokhoz fér hozzá. Adatértékeket, mint például a változók tartalmát nem lehet vele a képernyőre, normál állományba kiírni, vagy a képernyőről, normál állományból beolvasni. A SELECT eredményeit a blokk változóiban kell felfogni. Természetesen ezen értékek nem vesznek el örökre előlünk, a kapcsolatot a FireBird blokk és a külvilág között a kapcsolódó segédprogramok tudják megjeleníteni.

    Példa:

    /*terminátorjel átdefiniálása, hogy a blokkon belül használhassuk a ";"-t*/ SET TERM ^ ; /*eljárás fejléc*/ CREATE PROCEDURE MegBeOh_Kiadonkent /*paraméterlista*/ (pAzonosito SMALLINT) /*visszatérési értékek listája*/ RETURNS ( elorendeles SMALLINT, megrendeles SMALLINT, beerkezes SMALLINT, tanulokszama SMALLINT, elor_megr SMALLINT, megr_beerk SMALLINT, megr_tanulo SMALLINT, c_azonosito INTEGER, c_raktariszam VARCHAR(20), c_cim VARCHAR(120), c_tankonyviar DOUBLE PRECISION, c_boltiar DOUBLE PRECISION, c_raktarkeszlet SMALLINT ) /*lokális változók deklarációja*/ AS DECLARE VARIABLE sum_e_tanaripldszam INTEGER; DECLARE VARIABLE sum_e_tanuloipldszam INTEGER; DECLARE VARIABLE sum_m_tanaripldszam INTEGER; DECLARE VARIABLE sum_m_tanuloipldszam INTEGER; DECLARE VARIABLE count_m_cikkazonosito INTEGER; DECLARE VARIABLE count_e_cikkazonosito INTEGER; /*innentől a konkrét implementáció*/ BEGIN /*FOR-SELECT utasítás - legegyszerűbben egy kurzornak fogható fel, a SELECT eredményét soronként dolgozza fel törzsében*/ FOR SELECT c1.c_azonosito, c1.c_raktariszam, c1.c_cim, c1.c_tankonyviar, c1.c_boltiar, c1.c_raktarkeszlet, sum(e1.e_tanaripldszam), sum(e1.e_tanuloipldszam), sum(m1.m_tanaripldszam), sum(m1.m_tanuloipldszam) FROM megrendelestorzs m1 FULL OUTER JOIN elorendelestorzs e1 on (m1.m_cikkazonosito = e1.e_cikkazonosito) INNER JOIN cikktorzs c1 on (c1.c_azonosito = m1.m_cikkazonosito OR c1.c_azonosito = e1.e_cikkazonosito) WHERE c1.c_kiado=:pAzonosito GROUP BY c1.c_azonosito,c1.c_raktariszam,c1.c_cim,c1.c_tankonyviar,c1.c_boltiar,c1.c_raktarkeszlet ORDER BY c1.c_raktariszam,c1.c_cim INTO :c_azonosito,:c_raktariszam,:c_cim,:c_tankonyviar,:c_boltiar,:c_raktarkeszlet, sum_e_tanaripldszam,sum_e_tanuloipldszam,sum_m_tanaripldszam,sum_m_tanuloipldszam DO BEGIN /*azonosító szerint összegzés megrendelések között*/ SELECT COUNT(m_cikkazonosito) FROM megrendelestorzs WHERE m_cikkazonosito = :c_azonosito INTO count_m_cikkazonosito; /*azonosító szerint összegzés előrendelések között*/ SELECT COUNT(e_cikkazonosito) FROM elorendelestorzs WHERE e_cikkazonosito = :c_azonosito INTO count_e_cikkazonosito; /*default értéket adunk*/ IF (count_e_cikkazonosito = 0) THEN count_e_cikkazonosito = 1; IF (count_m_cikkazonosito = 0) THEN count_m_cikkazonosito = 1; /*még egy összegzés*/ SELECT SUM(bm_mennyiseg) FROM bejovomozgas WHERE bm_cikkazonosito=:c_azonosito INTO beerkezes; /*és még egy összegzés*/ SELECT COUNT(*) FROM tanulocsoport INNER JOIN csoportcikk ON (csc_csoportazonosito=tcs_csoportazonosito) WHERE csc_cikkazonosito=:c_azonosito INTO tanulokszama; /*innentől a visszaadandó értékek kiszámolása*/ elorendeles = (sum_e_tanaripldszam+sum_e_tanuloipldszam) / count_m_cikkazonosito; megrendeles = (sum_m_tanaripldszam+sum_m_tanuloipldszam) / count_e_cikkazonosito; elor_megr = megrendeles - elorendeles; megr_beerk = beerkezes - megrendeles; megr_tanulo = megrendeles - tanulokszama; /*ez az utasítás jelzi, hogy az eljárás készen van arra, hogy visszaadjon egy sort*/ SUSPEND; END END^ /*terminátorjel visszadefiniálása*/ SET TERM ; ^