User Defined Type (UDT) adattípusok az Oracle 10g-ben ----------------------------------------------------- Objektum típusok ================ CREATE OR REPLACE TYPE cim_typ AS OBJECT (utca VARCHAR2(40), varos VARCHAR2(30), orszag VARCHAR2(20), irszam NUMBER(4) ); CREATE OR REPLACE TYPE szemely_typ AS OBJECT (nev VARCHAR2(40), cim cim_typ ); Ahhoz, hogy más is használhassa az objektum típust (és annak metódusait), végrehajtási jogot kell rá adnunk: GRANT EXECUTE ON cim_typ TO public; GRANT EXECUTE ON szemely_typ TO public; Annak, aki hivatkozik az objektum típusra, annak tulajdonosát is meg kell adnia NIKOVITS.cim_typ módon vagy szinonimát is létrehozhat rá. CREATE synonym cim_typ FOR nikovits.cim_typ; Olyan tábla létrehozása, amelynek objektum típusú oszlopa is van: CREATE TABLE vevo (vevo_azon NUMBER(8), szemely szemely_typ); INSERT INTO vevo VALUES (1, szemely_typ('Kiss Gizi', cim_typ('Kicsi', 'Bp', 'Magyar', 1234))); INSERT INTO vevo VALUES (2, szemely_typ('Nagy Ede', cim_typ('Nagy', 'Arad', 'Romania', 4321))); A beszúráskor a fenti utasításban a típus konstruktorát kellett használnunk. SQLPLUS-ban a következőképpen nézhetjük meg az objektum szerkezetét: SQL> SET DESCRIBE DEPTH 3 SQL> DESCRIBE vevo Név Üres? Típus ----------------------------------------- -------- ---------------------------- VEVO_AZON NUMBER(8) SZEMELY SZEMELY_TYP NEV VARCHAR2(40) CIM CIM_TYP UTCA VARCHAR2(40) VAROS VARCHAR2(30) ORSZAG VARCHAR2(20) IRSZAM NUMBER(4) A tábla lekérdezése: Mennyi az irányítószáma az 1-es azonosítójú vevőnek? SELECT v.szemely.cim.irszam FROM vevo v WHERE vevo_azon=1; SZEMELY.CIM.IRSZAM ------------------ 1234 Megj: A korrelációs változó (v) használata nélkül nem tudjuk lekérdezni. Adjuk meg a személy összes adatát SELECT v.szemely FROM vevo v WHERE vevo_azon=1; SZEMELY(NEV, CIM(UTCA, VAROS, ORSZAG, IRSZAM)) ---------------------------------------------------------------- SZEMELY_TYP('Kiss Gizi', CIM_TYP('Kicsi', 'Bp', 'Magyar', 1234)) Megj: a fenti lekérdezés ereménye is objektum típusú lesz, így azt akár rögtön be is szúrhatnánk egy megfelelő táblába Adjuk meg az aradi személyek neveit SELECT v.szemely.nev FROM vevo v WHERE v.szemely.cim.varos='Arad'; A gyorsabb keresés céljából indexet is létrehozhatunk az attribútumra hasonló módon, mint egy oszlopra: CREATE INDEX vevo_varos ON vevo(szemely.cim.varos); Vajon mit látunk az indexről a katalógusban? SELECT index_name, table_name, column_name FROM user_ind_columns WHERE index_name = 'VEVO_VAROS'; INDEX_NAME TABLE_NAME COLUMN_NAME -------------------- --------------- ----------------------- VEVO_VAROS VEVO "SZEMELY"."CIM"."VAROS" Vagy akár összetett (több oszlopos) indexet is létrehozhatunk: CREATE INDEX vevo_nev_varos ON vevo(szemely.nev, szemely.cim.varos); Módosítani is tudjuk az objektumot (akár a belsejében levő adatot is) hasonló hivatkozással, mint a SELECT-ben láttuk. Módosítsuk Kiss Gizi irányítószámát. UPDATE VEVO v SET v.szemely.cim.irszam=5678 WHERE v.szemely.nev='Kiss Gizi'; Egy típus eldobása előtt az összes táblát és típust el kell dobnunk, amelyek használják az eldobni kívánt típust. -- DROP TYPE CIM_TYP; Objektum-relációs és relációs táblák átalakítása egymásba. Az objektum-relációs táblát könnyen átalakíthatjuk relációssá: CREATE TABLE vevo_rel(vevo_azon, nev, utca, varos, orszag, irszam) AS SELECT v.vevo_azon, v.szemely.nev, v.szemely.cim.utca, v.szemely.cim.varos, v.szemely.cim.orszag, v.szemely.cim.irszam FROM vevo v; De azt is megtehetjük, hogy nem hozunk létre újabb táblát, hanem csak egy nézetet, amely már hagyományos relációs szerkezetben mutatja az adatokat. CREATE VIEW vevo_v(vevo_azon, nev, utca, varos, orszag, irszam) AS SELECT v.vevo_azon, v.szemely.nev, v.szemely.cim.utca, v.szemely.cim.varos, v.szemely.cim.orszag, v.szemely.cim.irszam FROM vevo v; Sőt a hagyományos nézet módosításával módosíthatjuk is az objektum-relációs táblát UPDATE vevo_v SET utca='Kicsike' WHERE irszam=1234; A beszúrás azonban már nem lehetséges íly módon. Ennek az az oka, hogy a struktúra szétszedése különálló attribútumokra mindig egyértelmű, az összerakás azonban nem. -- INSERT INTO vevo_v VALUES(3, 'Gipsz Jakab', 'Akacos', 'Bp', 'Magyar', 2345) A fordított irányú átalakítás módja. (Most csak a nézetet adjuk meg, a tábla létrehozás ugyanígy működik, csupán a VIEW kulcsszó helyett TABLE-t kell megadnunk.) CREATE VIEW vevo_ov(vevo_azon, szemely) AS SELECT vevo_azon, szemely_typ(nev, cim_typ(utca,varos, orszag, irszam)) FROM vevo_rel; Ebbe a nézetbe be is szúrhatunk sorokat, és módosíthatjuk is, aminek eredménye a vevo_rel relációs táblában jelenik meg. INSERT INTO vevo_ov VALUES (3, szemely_typ('Gipsz Jakab', cim_typ('Patak', 'Kassa', 'Szlovak', 2345))); UPDATE vevo_ov v SET v.szemely.cim.utca='Pataki' WHERE v.vevo_azon=3; Ha a fenti módon létrehozunk egy táblát, akkor jó lenne utólag kideríteni minden információt az objektumtípusokról, amik a tábla oszlopaiban előfordulhatnak. Ha például kiváncsiak vagyunk a vevo tábla szerkezetére, használhatjuk a fenti describe-ot is, de nyilván a describe is a katalógusból veszi az információkat. Nézzük meg, milyen oszlopai vannak a táblának. SELECT column_name, data_type, data_type_owner FROM user_tab_columns WHERE table_name='VEVO'; COLUMN_NAME DATA_TYPE DATA_TYPE_OWNER ------------------------------ ------------------------- ---------------- VEVO_AZON NUMBER SZEMELY SZEMELY_TYP NIKOVITS A szemely_typ egy úgynevezett 'USER DEFINED' típus. Hogyan tudjuk a rendszerkatalógusból megnézni az információit? Egyelőre még azt sem tudhatjuk, hogy objektum típus, mert látni fogjuk, hogy vannak másféle user defined 'TYPE'-ok is. A következő katalógusokból szinte minden fontos információt megtudhatunk. DBA_OBJECTS, DBA_TYPES, DBA_TYPE_ATTRS, DBA_TYPE_METHODS, DBA_METHOD_PARAMS, DBA_METHOD_RESULTS, DBA_TYPE_VERSIONS, DBA_OBJ_COLATTRS (mely tábláknak van objektum oszlopa) SELECT owner, object_type FROM dba_objects WHERE object_name='SZEMELY_TYP'; OWNER OBJECT_TYPE ------------------------------ ------------------- NIKOVITS TYPE SELECT typecode, attributes FROM dba_types WHERE type_name='SZEMELY_TYP'; TYPECODE ATTRIBUTES ------------------------------ ---------- OBJECT 2 Látjuk, hogy objektum, aminek két attribútuma van. Nézzük meg, hogy mik az attribútumai. SELECT attr_no, attr_name, attr_type_name, attr_type_owner FROM dba_type_attrs WHERE type_name='SZEMELY_TYP' AND owner='NIKOVITS' ORDER BY 1; ATTR_NO ATTR_NAME ATTR_TYPE_NAME ATTR_TYPE_OWNER ---------- ------------------------------ ------------------------------ --------------------------- 1 NEV VARCHAR2 2 CIM CIM_TYP NIKOVITS A második attribútum még további vizsgálatot igényel az előzőekhez hasonlóan. SELECT owner, object_type FROM dba_objects WHERE object_name='CIM_TYP'; SELECT typecode, attributes FROM dba_types WHERE type_name='CIM_TYP'; SELECT attr_no, attr_name, attr_type_name, attr_type_owner FROM dba_type_attrs WHERE type_name='CIM_TYP' AND owner='NIKOVITS' ORDER BY 1; ATTR_NO ATTR_NAME ATTR_TYPE_NAME ---------- ------------------------------ ------------------ 1 UTCA VARCHAR2 2 VAROS VARCHAR2 3 ORSZAG VARCHAR2 4 IRSZAM NUMBER Ezek már mind ismerős típusok, így készen vagyunk.