User Defined Type (UDT) adattípusok az Oracle 10g-ben ----------------------------------------------------- Kollekció: ---------- Beágyazott tábla (NESTED TABLE) =============================== Hasonló a dinamikus tömbhöz, de azért vannak különbségek CREATE OR REPLACE TYPE szemelyek_nt AS TABLE OF szemely_typ; CREATE TABLE projekt2(nev VARCHAR2(15), resztvevok szemelyek_nt) TABLESPACE users STORAGE (INITIAL 200K) NESTED TABLE resztvevok STORE AS resztvevok_ntab (TABLESPACE users STORAGE (INITIAL 100K)) ; A beágyazott tábla egy külön táblában lesz tárolva, aminek a megadása kötelező!!! A fizikai tárolással kapcsolatos paraméterek (pl. táblatér) külön-külön megadhatók a két táblára. Ebből is látszik, hogy a beágyazott tábla adatai nem a fő tábla soraiban lesznek tárolva, ellentétben a dinamikus tömbökkel. A beágyazott táblába akármennyi sort beszúrhatunk, a dinamikus tömbnek van felső határa!!! INSERT INTO projekt2 VALUES('Utepites', szemelyek_nt(szemely_typ('Kovacs Attila', cim_typ('Kicsi', 'Bp', 'Magyar', 1234)), szemely_typ('Kiss Istvan', cim_typ('Nagy', 'Vac', 'Magyar', 4321)) ) ); INSERT INTO projekt2 VALUES('Lakopark', szemelyek_nt(szemely_typ('Kiss Istvan', cim_typ('Nagy', 'Vac', 'Magyar', 4321)), szemely_typ('Takacs Bela', cim_typ('Rovid', 'Szeged', 'Magyar', 3456)) ) ); A beágyazott táblák lekérdezésének szintaxisa hasonló a dinamikus tömbökéhez. Az alábbi lekérdezés 1 sorral, abban beágyazott tábla típussal tér vissza. SELECT resztvevok FROM projekt2 WHERE nev='Utepites'; RESZTVEVOK(NEV, CIM(UTCA, VAROS, ORSZAG, IRSZAM)) ------------------------------------------------------------------------------------ SZEMELYEK_NT(SZEMELY_TYP('Kovacs Attila', CIM_TYP('Kicsi', 'Bp', 'Magyar', 1234)), SZEMELY_TYP('Kiss Istvan', CIM_TYP('Nagy', 'Vac', 'Magyar', 4321)) Most is táblává alakíthatjuk, és ekkor két sort kapunk vissza: SELECT * FROM TABLE(SELECT resztvevok FROM projekt2 WHERE nev='Utepites'); NEV CIM(UTCA, VAROS, ORSZAG, IRSZAM) ----------------- ------------------------------------------ Kovacs Attila CIM_TYP('Kicsi', 'Bp', 'Magyar', 1234) Kiss Istvan CIM_TYP('Nagy', 'Vac', 'Magyar', 4321) Ha egy konkrét beágyazott tábla adatait szeretném lekérdezni, akkor az alábbi szintaxisát kell használni a TABLE függvénynek. Ekkor a zárójelbeli lekérdezés egyetlen sort adhat csak vissza többet nem. SELECT nev, t1.cim.varos FROM TABLE(SELECT resztvevok FROM projekt2 WHERE nev='Utepites') t1; NEV CIM.VAROS ---------------------------------------- --------- Kovacs Attila Bp Kiss Istvan Vac Ha pedig az összes beágyazott tábla adatait szeretném megkapni, akkor az alábbi a szintaxis. Ekkor viszont a külső tábla (p) használata nem nélkülözhető, amit implicit módon a megfelelő sorokhoz fog kapcsolni a rendszer. SELECT p.nev, t.nev FROM projekt2 p, TABLE(p.resztvevok) t; NEV NEV --------------- --------------- Utepites Kovacs Attila Utepites Kiss Istvan Lakopark Kiss Istvan Lakopark Takacs Bela Most sem kell WHERE feltétel, anélkül is csak a megfelelő párosításokat adja vissza. Most azonban a beágyazott táblák tartalmát módosíthatjuk insert, update vagy delete-tel, amit dinamikus tömbök esetén nem tehetünk meg!!! Vegyük fel az útépítésre Bölcs Leót. A zárójelen belüli WHERE feltétel megadása nélkül hibás lenne az utasítás, vagyis nem tudunk egyszerre több beágyazott táblába beszúrni. INSERT INTO TABLE (SELECT resztvevok FROM projekt2 WHERE nev='Utepites') VALUES(szemely_typ('Bolcs Leo', cim_typ('Rovid', 'Pecs', 'Magyar', 3456))); SELECT p.nev, t.nev, t.cim FROM projekt2 p, TABLE(p.resztvevok) t; NEV NEV CIM(UTCA, VAROS, ORSZAG, IRSZAM) --------------- --------------- -------------------------------------------- Utepites Bolcs Leo CIM_TYP('Rovid', 'Pecs', 'Magyar', 3456) Utepites Kovacs Attila CIM_TYP('Kicsi', 'Bp', 'Magyar', 1234) Utepites Kiss Istvan CIM_TYP('Nagy', 'Vac', 'Magyar', 4321) Lakopark Kiss Istvan CIM_TYP('Nagy', 'Vac', 'Magyar', 4321) Lakopark Takacs Bela CIM_TYP('Rovid', 'Szeged', 'Magyar', 3456) Módosítsuk Bolcs Leo címét Debrecenre. A zárójelen belüli WHERE feltétel most is kötelező. Ha a külső WHERE feltételt hagynánk el, akkor az útépítésen mindenki címe módosulna. UPDATE TABLE (SELECT resztvevok FROM projekt2 WHERE nev='Utepites') r SET r.cim.varos='Debrecen' WHERE r.nev='Bolcs Leo'; NEV NEV CIM(UTCA, VAROS, ORSZAG, IRSZAM) --------------- --------------- --------------------------------------------- Utepites Bolcs Leo CIM_TYP('Rovid', 'Debrecen', 'Magyar', 3456) Utepites Kovacs Attila CIM_TYP('Kicsi', 'Bp', 'Magyar', 1234) Utepites Kiss Istvan CIM_TYP('Nagy', 'Vac', 'Magyar', 4321) Lakopark Kiss Istvan CIM_TYP('Nagy', 'Vac', 'Magyar', 4321) Lakopark Takacs Bela CIM_TYP('Rovid', 'Szeged', 'Magyar', 3456) Végül töröljük ki Bölcs Leót. DELETE FROM TABLE (SELECT resztvevok FROM projekt2 WHERE nev='Utepites') r WHERE r.nev='Bolcs Leo'; NEV NEV CIM(UTCA, VAROS, ORSZAG, IRSZAM) --------------- --------------- ------------------------------------------ Utepites Kovacs Attila CIM_TYP('Kicsi', 'Bp', 'Magyar', 1234) Utepites Kiss Istvan CIM_TYP('Nagy', 'Vac', 'Magyar', 4321) Lakopark Kiss Istvan CIM_TYP('Nagy', 'Vac', 'Magyar', 4321) Lakopark Takacs Bela CIM_TYP('Rovid', 'Szeged', 'Magyar', 3456) Információk a katalógusból: A DESCRIBE most is kiírja a szerkezetet Név Üres? Típus ----------------------------------------- -------- ---------------- NEV VARCHAR2(15) RESZTVEVOK SZEMELYEK_NT NEV VARCHAR2(40) CIM CIM_TYP UTCA VARCHAR2(40) VAROS VARCHAR2(30) ORSZAG VARCHAR2(20) IRSZAM NUMBER(4) SELECT column_name, data_type, data_type_owner FROM user_tab_columns WHERE table_name='PROJEKT2'; COLUMN_NAME DATA_TYPE DATA_TYPE_OWNER ------------------------------ -------------------- --------------- NEV VARCHAR2 RESZTVEVOK SZEMELYEK_NT NIKOVITS SELECT owner, object_type FROM dba_objects WHERE object_name='SZEMELYEK_NT'; SELECT typecode, attributes FROM dba_types WHERE type_name='SZEMELYEK_NT'; TYPECODE ATTRIBUTES ------------------------------ ---------- COLLECTION 0 SELECT coll_type, upper_bound, elem_type_name, elem_type_owner FROM dba_coll_types WHERE type_name='SZEMELYEK_NT'; COLL_TYPE UPPER_BOUND ELEM_TYPE_NAME ELEM_TYPE_OWNER ---------- ----------- -------------- --------------- TABLE SZEMELY_TYP NIKOVITS További információk: Mely tábláknak van beágyazott tábla oszlopa, a tároló táblák, és azok oszlopai: DBA_NESTED_TABLES, DBA_NESTED_TABLE_COLS