Értékek megnevezett kezelésére a PL/SQL programban nevesített konstansokat és változókat használhatunk. A program szövegében ezek mindig a nevükkel jelennek meg. A nevesített konstans értéke állandó, a változó értéke a futás folyamán tetszőlegesen megváltoztatható.
Nevesített konstans és változó egy blokk, alprogram vagy csomag deklarációs részében deklarálható. A deklarációs utasítás megadja a nevet, a típust, a kezdőértéket és esetlegesen a NOT NULL megszorítást.
A nevesített konstans deklarációjának szintaxisa:
név CONSTANT típus [NOT NULL] {:= | DEFAULT} kifejezés;
A változó deklarációjának szintaxisa:
név típus [[NOT NULL] {:= | DEFAULT} kifejezés];
A típus az alábbi lehet:
{ kollekciónév%TYPE
| kollekciótípus_név
| kurzornév%ROWTYPE
| kurzorváltozó_név%TYPE
| adatbázis_tábla_név{%ROWTYPE |.oszlopnév%TYPE}
| objektumnév%TYPE
| [REF] objektumtípus_név
| rekordnév%TYPE
| rekordtípus_név
| kurzorreferenciatípus_név
| skalár_adattípus_név
| változónév%TYPE}
A nevesített konstansnál kötelező a kifejezés megadása, ez határozza meg a fix értékét.
Változónál viszont ez opcionális, az explicit kezdőértékadást (vagy inicializálást) szolgálja.
A név egy azonosító.
Az adatbázis_tábla_név.oszlopnév egy adatbázisban létező tábla valamely oszlopát hivatkozza.
A rekordnév az adott ponton ismert, felhasználó által definiált rekord neve, a mezőnév ennek valamelyik mezője.
A skalár_adattípus_név valamelyik előre definiált skalár adattípus neve (lásd 3. fejezet).
A változónév egy programban deklarált változó neve.
A kollekciónév egy beágyazott tábla, egy asszociatív tömb vagy egy dinamikus tömb, a kollekciótípus_név egy ilyen felhasználói típus neve.
A kurzornév egy explicit kurzor neve.
A kurzorváltozó_név egy PL/SQL kurzorváltozó neve.
Az objektumtípus_név egy objektumtípus neve, az objektumnév egy ilyen típus egy példánya.
A rekordtípus_név egy felhasználó által létrehozott rekordtípus neve.
A kurzorreferenciatípus_név a felhasználó által létrehozott REF CURSOR típus neve vagy SYS_REFCURSOR.
A %TYPE egy korábban már deklarált kollekció, kurzorváltozó, mező, objektum, rekord, adatbázistábla oszlop vagy változó típusát veszi át és ezzel a típussal deklarálja a változót vagy nevesített konstansot. Használható még tábla oszlopának típusmegadásánál is.
A %TYPE használatának két előnye van. Egyrészt nem kell pontosan ismerni az átvett típust, másrészt ha az adott eszköz típusa megváltozik, a változó típusa is automatikusan, futási időben követi ezt a változást.
1. példa
-- a v_Telszam deklarációja az ugyfel táblához kötődik a %TYPE miatt
v_Telszam ugyfel.tel_szam%TYPE DEFAULT '06-52-123456';
-- Az új változót felhasználhatjuk újabb deklarációban.
v_Telszam2 v_Telszam%TYPE;
-- A v_Telszam%TYPE típus azonban nem tartalmaz kezdőértékadást!
-- Így v_Telszam2 típusa megegyezik v_Telszam típusával,
-- kezdőértéke azonban NULL lesz.
A %ROWTYPE egy olyan rekordtípust szolgáltat, amely egy adatbázis-táblabeli sort, vagy egy kurzor által kezelt sort reprezentál. A rekordtípus mezői és a megfelelő oszlopok neve és típusa azonos.
2. példa
-- az ugyfel tábla szerkezetével megegyező rekordtípusú változók
v_Ugyfel ugyfel%ROWTYPE;
v_Ugyfel2 v_Ugyfel%TYPE;
A %ROWTYPE alkalmazása esetén a változónak nem lehet kezdőértéket adni. Ennek oka az, hogy tetszőleges rekordtípusú változónak sem lehet kezdőértéket adni.
A NOT NULL megszorítás megtiltja, hogy a változónak vagy nevesített konstansnak az értéke NULL legyen. Ha futás közben egy így deklarált változónak a NULL értéket próbálnánk adni, akkor a VALUE_ERROR kivétel váltódik ki. A NOT NULL megszorítás csak akkor adható meg egy változó deklarációjánál, ha az kezdőértéket kap.
3. példa
DECLARE
-- NOT NULL deklarációnál kötelező az értékadás
v_Szam1 NUMBER NOT NULL := 10;
-- v_Szam2 kezdőértéke NULL lesz
v_Szam2 NUMBER;
BEGIN
v_Szam1 := v_Szam2; -- VALUE_ERROR kivételt eredményez
END;
/
A NATURALN és POSITIVEN altípusok tartományának nem eleme a NULL (lásd 3.1. alfejezet). Ezen típusok használata esetén a kezdőértékadás kötelező. Ezért a következő deklarációk ekvivalensek:
szamlalo NATURALN NOT NULL := 0;
szamlalo NATURALN := 0;
Az alábbi deklaráció viszont szabálytalan:
szamlalo NATURALN;
A := vagy DEFAULT utasításrész a kezdőértékadást szolgálja, ahol a kifejezés egy tetszőleges, a megadott típussal kompatibilis típusú kifejezés.
Ha egy változónak nem adunk explicit kezdőértéket, akkor alapértelmezett kezdőértéke NULL lesz.
Hasonló módon kezdőérték adható még alprogram formális paramétereinek, kurzor paramétereinek és rekord mezőinek.
4. példa
-- nevesített konstans deklarációja, az értékadó kifejezés egy
-- függvényhívás
c_Most CONSTANT DATE := SYSDATE;
-- változódeklaráció kezdőértékadás nélkül
v_Egeszszam PLS_INTEGER;
v_Logikai BOOLEAN;
-- változódeklaráció kezdőértékadással
v_Pozitiv POSITIVEN DEFAULT 1;
v_Idopecset TIMESTAMP := CURRENT_TIMESTAMP;
-- kezdőértékadás rekordtípus mezőjének
TYPE t_kiserlet IS RECORD (
leiras VARCHAR2(20),
probalkozas NUMBER := 0,
sikeres NUMBER := 0
);
-- rekord mezőinek csak a típusdeklarációban lehet kezdőértéket adni
v_Kiserlet t_kiserlet;
A nevesített konstansok és változók kezdőértékadása mindig megtörténik, valahányszor aktivizálódik az a blokk vagy alprogram, amelyben deklaráltuk őket.
Csomagban deklarált nevesített konstans és változó kezdőértéket munkamenetenként csak egyszer kap, kivéve ha a csomagra SERIALLY_REUSABLE pragma van érvényben. A pragma leírását lásd a 10. fejezetben.