Felhasználói altípusok

Ahogy azt már említettük, az altípus ugyanazokkal a műveletekkel és reprezentációval rendelkezik, mint alaptípusa, legfeljebb annak tartományát szűkítheti. Tehát az altípus nem új típus. Az előzőekben találkoztunk beépített altípusokkal. Most megnézzük, hogyan hozhat létre a felhasználó saját altípust. Erre szolgál a SUBTYPE deklarációs utasítás, amelyet egy blokk, alprogram vagy csomag deklarációs részében helyezhetünk el. Szintaxisa:

SUBTYPE altípus_név IS alaptípus_név[(korlát)] [NOT NULL];

ahol az alaptípus_név azon típusnak a neve, amelyből az altípust származtatjuk, altípus_név pedig az új altípus neve. A NOT NULL opció megadása esetén az altípus tartománya nem tartalmazza a NULL értéket.

A korlát hossz, pontosság és skála információkat adhat meg. Ugyanakkor a felhasználói altípus (a NULL-tól eltekintve) nemkorlátozott altípusként jön létre. Tehát az altípus_név deklarációban való szerepeltetésénél a korlát értékét meghaladó érték is megadható. BINARY_INTEGER alaptípus esetén létrehozhatunk korlátozott altípust is, a tartomány leszűkítésének alakja:

RANGE alsó_határ..felső_határ

A RANGE után egy érvényes intervallumnak kell állnia, ez lesz az altípus tartománya. Példák altípusok használatára:

SUBTYPE t_szam IS NUMBER;

SUBTYPE t_evszam IS NUMBER(4,0);

SUBTYPE t_tiz IS NUMBER(10);

SUBTYPE t_egy IS t_tiz(1); -- NUMBER(1)

SUBTYPE t_ezres IS t_tiz(10, -3); -- NUMBER(10, -3)

SUBTYPE t_nev IS VARCHAR2(40);

-- felüldefiniáljuk az előző hosszmegszorítást

SUBTYPE t_nev2 IS t_nev(50);

v_Tiz t_tiz := 12345678901; -- túl nagy az érték pontossága

v_Egy t_egy := 12345; -- túl nagy az érték pontossága

v_Ezres t_ezres := 12345; -- 12000 kerül tárolásra

SUBTYPE t_szo IS VARCHAR2;

v_Szo t_szo(10);

v_Szo2 t_szo; -- Hiba, nincs megadva a hossz

1. példa (Szabályos altípus deklarációk)

CREATE TABLE tab1 (
id NUMBER NOT NULL,
nev VARCHAR2(40)
)
/

DECLARE
-- rekordtípusú altípus
SUBTYPE t_tabsor IS tab1%ROWTYPE;
-- t_nev örökli a tab1.nev hosszmegszorítását
SUBTYPE t_nev IS tab1.nev%TYPE NOT NULL;
-- t_id nem örökli a tab1.id NOT NULL megszorítását,
-- mivel ez táblamegszorítás, nem a típushoz tartozik.
SUBTYPE t_id IS tab1.id%TYPE;
-- t_nev2 örökli a tab1.nev hosszmegszorítását és NOT NULL
-- megszorítását is, mert PL/SQL típus esetén a NOT NULL
-- is a típushoz tartozik.
SUBTYPE t_nev2 IS t_nev;
v_Id t_id; -- NUMBER típusú, NULL kezdőértékkel
v_Nev1 t_nev; -- hibás, fordítási hiba, NOT NULL típusnál
-- mindig kötelező az értékadás
v_Nev2 t_nev := 'XY'; -- így már jó
BEGIN
v_Id := NULL; -- megengedett, lehet NULL
v_Nev2 := NULL; -- hibás, NULL-t nem lehet értékül adni
END;
/

DECLARE
-- RANGE megszorítás altípusban
SUBTYPE t_szamjegy10 IS BINARY_INTEGER RANGE 0..9;
v_Szamjegy10 t_szamjegy10;
v_Szamjegy16 BINARY_INTEGER RANGE 0..15;
BEGIN
-- megengedett értékadások
v_Szamjegy10 := 9;
v_Szamjegy16 := 15;
-- hibás értékadások, mindkettő futási idejű hibát váltana ki
-- v_Szamjegy10 := 10;
-- v_Szamjegy16 := 16;
END;
/

2. példa (Szabálytalan altípus deklaráció)

-- nem lehet az altípusban megszorítás

SUBTYPE t_skala(skala) IS NUMBER(10,skala);