3. fejezet - Adattípusok

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.