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);