A literálok, nevesített konstansok, változók mindegyike rendelkezik adattípus komponenssel, amely meghatározza az általuk felvehető értékek tartományát, az értékeken végezhető műveleteket és az értékek tárbeli megjelenítési formáját (reprezentációját).
Az adattípusok lehetnek előre definiált (beépített) vagy a felhasználó által definiált (felhasználói) típusok. Az előre definiált adattípusokat a STANDARD csomag tartalmazza. Ezek minden PL/SQL programból elérhetők.
Egy tetszőleges adattípushoz (mint alaptípushoz) kapcsolódóan beszélhetünk altípusról. Az altípus ugyanazokkal a műveletekkel és reprezentációval rendelkezik, mint alaptípusa, de tartománya részhalmaza az alaptípus tartományának.
Az altípusok növelik a használhatóságot, az ISO/ANSI típusokkal való kompatibilitást és a kód olvashatóságát. A STANDARD csomag számos altípust definiál (lásd később ebben a fejezetben). A felhasználó maga is létrehozhat altípusokat.
Azt az altípust, amelynek tartománya megegyezik alaptípusának tartományával, nemkorlátozott altípusnak nevezzük. Ebben az esetben az alaptípus és az altípus neve szinonimáknak tekinthetők.
A PL/SQL ötféle adattípusról beszél. A skalártípus tartományának elemei nem rendelkeznek belső szerkezettel, az összetett típuséi viszont igen. A referenciatípus tartományának elemei más típusok elemeit címző pointerek. A LOB típus olyan értékeket tartalmaz (ezeket lokátoroknak nevezzük), amelyek egy nagyméretű objektum helyét határozzák meg. Az objektumtípusok az egységbe zárást szolgálják.
A PL/SQL előre definiált adattípusait a 3.1. táblázat tartalmazza.
Ebben a fejezetben a skalár-, a LOB és a rekordtípusokról lesz szó, a további típusokat a későbbi fejezetekben tárgyaljuk.
A skalártípusok, mint az a 3.1. táblázatban látható, családokra tagolódnak. A következőkben ezeket a családokat tekintjük át.
3.1. táblázat - Előre definiált adattípusok
SKALÁRTÍPUSOK |
||
Numerikus család |
Karakteres család |
Dátum/intervallum család |
BINARY_DOUBLE |
CHAR |
DATE |
BINARY_FLOAT |
CHARACTER |
INTERVAL DAY TO SECOND |
BINARY_INTEGER |
LONG |
INTERVAL YEAR TO MONTH |
DEC |
LONG RAW |
TIMESTAMP |
DECIMAL |
NCHAR |
TIMESTAMP WITH TIME |
DOUBLE PRECISION |
NVARCHAR2 |
ZONE |
FLOAT |
RAW |
TIMESTAMP WITH LOCAL |
INT |
ROWID |
TIME ZONE |
INTEGER |
STRING | |
NATURAL |
UROWID |
|
NATURALN |
VARCHAR | |
NUMBER |
VARCHAR2 | |
NUMERIC | ||
PLS_INTEGER | ||
POSITIVE |
||
POSITIVEN |
Logikai család |
|
REAL |
BOOLEAN |
|
SIGNTYPE |
||
SMALLINT | ||
ÖSSZETETT TÍPUSOK | LOB TÍPUSOK | REFERENCIATÍPUSOK |
RECORD | BFILE REF |
CURSOR |
TABLE | BLOB | SYS_REFCURSOR |
VARRAY |
CLOB |
REF objektumtípus |
NCLOB |
Numerikus család
A numerikus típusok tartományának értékei egészek vagy valósak. Négy alaptípus tartozik a családba, ezek: NUMBER, BINARY_INTEGER, BINARY_DOUBLE és BINARY_FLOAT. A többi típus valamelyikük altípusaként van definiálva.
NUMBER TÍPUS
Ez a típus egész és valós számokat egyaránt képes kezelni. Megegyezik a NUMBER adatbázistípussal. Tartománya: 1E–130..10E125. Belső ábrázolása fixpontos vagy lebegőpontos decimális. Szintaxisa a következő:
NUMBER
[(p[,s])]
A teljes alakban p a pontosság, s a skála megadását szolgálja. Értékük csak egész literál lehet. A pontosság az összes számjegy számát, a skála a tizedes jegyek számát határozza meg. Az s-nek a –84..127 tartományba kell esnie, p alapértelmezett értéke 38, lehetséges értékeinek tartománya 1..38. Ha mindkettőt megadtuk, akkor a belső ábrázolás fixpontos. Ha sem p, sem s nem szerepel, akkor s értéke tetszőleges 1 és 38 között. Ha p szerepel és s-et nem adjuk meg, akkor egész értéket kezelünk (tehát ekkor s = 0 és az ábrázolás fixpontos). Negatív skála esetén a kezelt érték a tizedesponttól balra, az s-edik jegynél kerekítésre kerül. Ha a kezelendő érték törtjegyeinek száma meghaladja a skála értékét, akkor s tizedesre kerekítés történik. A 3.2. táblázatban láthatunk példákat.
3.2. táblázat - Pontosság és skála a NUMBER típusnál
Típus |
Kezelendő érték |
Tárolt érték |
NUMBER |
1111.2222 |
1111.2222 |
NUMBER(3) |
321 |
321 |
NUMBER(3) |
3210 |
Túlcsordulás |
NUMBER(4,3) |
33.222 |
Túlcsordulás |
NUMBER(4,3) |
3.23455 |
3.235 |
NUMBER(3,–3) |
1234 |
1000 |
NUMBER(3,–1) |
1234 |
1230 |
A NUMBER
nemkorlátozott
altípusai:
DEC, DECIMAL, DOUBLE PRECISION, FLOAT,
NUMERIC.
A NUMBER
korlátozott
altípusai:
REAL (p maximuma 18)
INT, INTEGER, SMALLINT (s = 0, tehát egészek).
A DEC, DECIMAL, NUMERIC, INT, INTEGER, SMALLINT típusok belső ábrázolása fixpontos, a REAL, DOUBLE PRECISION, FLOAT típusoké pedig lebegőpontos.
BINARY_INTEGER TÍPUS
A NUMBER típus belső ábrázolása hatékony tárolást tesz lehetővé, de az aritmetikai műveletek
közvetlenül nem végezhetők el rajta. A PL/SQL motor műveletek végzésénél a NUMBER típust automatikusan binárissá konvertálja, majd a művelet elvégzése után szintén automatikusan végrehajtja a fordított irányú átalakítást is.
Ha egy egész értéket nem akarunk tárolni, csak műveletet akarunk vele végezni, akkor használjuk a BINARY_INTEGER adattípust. Ez a típus tehát egész értékeket kezel a –2147483647..2147483647 tartományban. Ezeket az értékeket fixpontosan tárolja, így a műveletvégzés gyorsabb.
A PLS_INTEGER típus a BINARY_INTEGER nemkorlátozott altípusa, de nem teljesen kompatibilisek. Tartományuk azonos, de a PLS_INTEGER típus műveletei gépi aritmetikát használnak, így gyorsabbak, mint a könyvtári aritmetikát használó BINARY_INTEGER műveletek.
A BINARY_INTEGER korlátozott altípusai a következők:
NATURAL | 0..2147483647 |
NATURALN | 0..2147483647 és NOT NULL |
POSITIVE | 1..2147483647 |
POSITIVEN | 1..2147483647 és NOT NULL |
SIGNTYPE | –1,0,1 |
BINARY_DOUBLE, BINARY_FLOAT TÍPUSOK
A BINARY_FLOAT típus belső ábrázolása egyszeres pontosságú (32 bites), a BINARY_DOUBLE típusé dupla pontosságú (64 bites) bináris lebegőpontos. A számításintenzív alkalmazásokban játszanak elsődleges szerepet, mert velük az aritmetikai műveletek gyorsabban végezhetők, mert a gépi aritmetikát használják közvetlenül. Ezen típusok értékeivel végzett műveletek speciális értékeket eredményezhetnek, amelyeket ellenőrizhetünk beépített nevesített konstansokkal való hasonlítással, és ekkor nem váltódik ki kivétel (részletekért lásd[18], [19], [21]).
Karakteres család
A karakteres típusok tartományának elemei tetszőleges karaktersorozatok. Reprezentációjuk az alkalmazott karakterkódtól függ.
CHAR TÍPUS
Fix hosszúságú karakterláncok kezelésére alkalmas. Szintaxisa:
CHAR [(h [CHAR|BYTE])]
ahol h az 1..32767 intervallumba eső egész literál, alapértelmezése 1. A h értéke bájtokban (BYTE) vagy karakterekben (CHAR – ez az alapértelmezés) értendő és a hosszat adja meg. A karakterláncok számára mindig ennyi bájt foglalódik le, ha a tárolandó karakterlánc ennél rövidebb, akkor jobbról kiegészül szóközökkel.
A CHARACTER a CHAR nemkorlátozott altípusa, így annak szinonimájaként használható.
VARCHAR2 TÍPUS
Változó hosszúságú karakterláncok kezelésére alkalmas. Szintaxisa a következő:
VARCHAR2(h [CHAR|BYTE])
ahol h az 1..32767 intervallumba eső egész literál és a maximális hosszat adja meg. Értéke CHAR megadása esetén karakterekben, BYTE esetén bájtokban, ezek hiánya esetén karakterekben értendő. A maximális hossz legfeljebb 32767 bájt lehet.
A megadott maximális hosszon belül a kezelendő karakterláncok csak a szükséges mennyiségű bájtot foglalják el.
A VARCHAR2 típus nemkorlátozott altípusai: STRING és VARCHAR.
NCHAR ÉS NVARCHAR2 TÍPUSOK
Az Oracle NLS (National Language Support – nemzeti nyelvi támogatás) lehetővé teszi egybájtos és több-bájtos karakterkódok használatát és az ezek közötti konverziót. Így az alkalmazások különböző nyelvi környezetekben futtathatók.
A PL/SQL két karakterkészletet támogat, az egyik az adatbázis karakterkészlet, amely az azonosítók és egyáltalán a forráskód kialakításánál használható, a másik a nemzeti karakterkészlet, amely az NLS-adatok kezelését teszi lehetővé.
Az NCHAR és NVARCHAR2 típusok megfelelnek a CHAR és VARCHAR2 típusoknak, de ezekkel a nemzeti karakterkészlet karaktereiből alkotott karakterláncok kezelhetők. További különbség, hogy a maximális hossz itt mindig karakterekben értendő.
LONG TÍPUS
A VARCHAR2-höz hasonló, változó hosszúságú karakterláncokat kezelő típus, ahol a maximális hossz 32760 bájt lehet.
LONG RAW TÍPUS
Változó hosszúságú bináris adatok (bájtsorozatok) kezelésére való. Maximális hossza 32760 bájt.
RAW TÍPUS
Nem strukturált és nem interpretált bináris adatok (például grafikus adat, kép, video) kezelésére való. Szintaxisa:
RAW(h)
ahol h az 1..32767 intervallumba eső egész literál, amely a hosszat határozza meg bájtokban.
ROWID, UROWID TÍPUSOK
Minden adatbázistábla rendelkezik egy ROWID nevű pszeudooszloppal, amely egy bináris értéket, a sorazonosítót tárolja. Minden sorazonosító a sor tárolási címén alapul. A fizikai sorazonosító egy „normális” tábla sorát azonosítja, a logikai sorazonosító pedig egy asszociatív tömbét. A ROWID adattípus tartományában fizikai sorazonosítók vannak. Az UROWID adattípus viszont fizikai, logikai és idegen (nem Oracle) sorazonosítókat egyaránt tud kezelni.
Dátum/intervallum család
Ezen családon belül három alaptípus létezik: DATE, TIMESTAMP és INTERVAL.
DATE TÍPUS
Ez a típus a dátum és idő információinak kezelését teszi lehetővé. Minden értéke 7 bájton tárolódik, amelyek rendre az évszázad, év, hónap, nap, óra, perc, másodperc adatait tartalmazzák.
A típus tartományába az időszámítás előtti 4712. január 1. és időszámítás szerinti 9999. december 31. közötti dátumok tartoznak. A Julianus naptár alkalmazásával az időszámítás előtti 4712. január 1-jétől eltelt napok számát tartalmazza a dátum.
Az aktuális dátum és idő lekérdezhető a SYSDATE függvény visszatérési értékeként.
TIMESTAMP TÍPUS
Ezen típus tartományának értékei az évet, hónapot, napot, órát, percet, másodpercet és a másodperc törtrészét tartalmazzák. Időbélyeg kezelésére alkalmas. Szintaxisa:
TIMESTAMP[(p)] [WITH [LOCAL] TIME
ZONE]
ahol p a másodperc törtrészének kifejezésére használt számjegyek száma. Alapértelmezésben 6. A WITH TIME ZONE megadása esetén az értékek még a felhasználó időzónájának adatát is tartalmazzák. A LOCAL megadása esetén pedig az adatbázisban tárolt (és nem a felhasználói) időzóna adata kerül kezelésre.
INTERVAL TÍPUS
A INTERVAL típus segítségével két időbélyeg közötti időtartam értékeit kezelhetjük. Szintaxisa:
INTERVAL {YEAR[(p)] TO
MONTH|DAY[(np)] TO
SECOND[(mp)]}
A YEAR[(p)] TO MONTH az időintervallumot években és hónapokban adja. A p az évek értékének tárolására használt számjegyek száma. Alapértelmezett értéke 2.
A DAY[(np)] TO SECOND [(mp)] az időintervallumot napokban és másodpercekben adja; np a napok, mp a másodpercek értékének tárolására használt számjegyek száma; np alapértelmezett értéke 2, mp-é 6.
Logikai család
Egyetlen típus tartozik ide, a BOOLEAN, amelynek tartománya a logikai igaz, hamis és a NULL értéket tartalmazza. Logikai típusú literál nincs, de az Oracle három beépített nevesített konstanst értelmez. TRUE értéke a logikai igaz, FALSE értéke a logikai hamis és NULL értéke NULL.