User Defined Type (UDT) adattípusok az Oracle 10g-ben ----------------------------------------------------- Objektumtábla ============= DBA_OBJECT_TABLES, DBA_REFS A korábbi objektumokat egy tábla oszlopába tettük bele. Létrehozhatunk olyan táblát is, ami csak az objektumokat tartalmazza, más oszlopot nem. Ilyen esetben úgynevezett sorobjektumok lesznek a táblában. A sorobjektumoknak van egy egyedi objektum azonosítója (OID), amit az Oracle ad nekik a sor létrehozásakor. Kicsit hasonlatos ez a korábbi ROWID-hez, amit szintén a rendszer adott (azáltal, hogy fizikailag elhelyezte a sort). Használjuk a korábbi személy_typ típust objektumtábla létrehozására. CREATE TABLE szemely_ot OF szemely_typ; INSERT INTO szemely_ot VALUES (szemely_typ('Albert Flori', cim_typ('Kicsi', 'Bp', 'Magyar', 1234))); INSERT INTO szemely_ot VALUES (szemely_typ('Bene Feri', cim_typ('Nagy', 'Vac', 'Magyar', 4321))); A szemely_typ attribútumaira úgy hivatkozhatunk, mintha a tábla oszlopai lennének. UPDATE szemely_ot sz SET sz.cim.irszam=5678 WHERE nev='Albert Flori'; A sorváltozó használata kötelező!!! Lekérdezések a táblából: SELECT * FROM szemely_ot WHERE nev='Albert Flori'; NEV CIM(UTCA, VAROS, ORSZAG, IRSZAM) -------------- -------------------------------------- Albert Flori CIM_TYP('Kicsi', 'Bp', 'Magyar', 5678) A fenti lekérdezés 2 oszlopban adja vissza az eredményt. Ha objektum típusként szeretnénk az eredményt megkapni, akkor a VALUE függvényt kell használnunk, vagy az OBJECT_VALUE hivatkozást. SELECT VALUE(sz) FROM szemely_ot sz WHERE nev='Albert Flori'; VALUE(SZ)(NEV, CIM(UTCA, VAROS, ORSZAG, IRSZAM)) ------------------------------------------------------------------- SZEMELY_TYP('Albert Flori', CIM_TYP('Kicsi', 'Bp', 'Magyar', 5678)) SELECT OBJECT_VALUE FROM szemely_ot sz WHERE nev='Albert Flori'; VALUE(SZ)(NEV, CIM(UTCA, VAROS, ORSZAG, IRSZAM)) ------------------------------------------------------------------- SZEMELY_TYP('Albert Flori', CIM_TYP('Kicsi', 'Bp', 'Magyar', 5678)) Az objektum azonosítókat le is kérdezhetjük, az eredmény persze nem sokat mond: SELECT REF(sz) FROM szemely_ot sz; REF(SZ) -------------------------------------------------------------------------------------- 00002802095B6F2D9B82040762E040B59D66A575FD5B6F2D9B82030762E040B59D66A575FD0100F9C20000 00002802095B6F2D9B82050762E040B59D66A575FD5B6F2D9B82030762E040B59D66A575FD0100F9C20001 Viszont ezeket a hivatkozásokat pl. egy másik táblában eltárolhatjuk, vagy egy PLSQL-beli program változójába tehetjük, hogy később felhasználjuk. CREATE TABLE csapat2(nev VARCHAR2(10), vezeto REF szemely_typ SCOPE IS szemely_ot) A SCOPE azt korlátozza, hogy a referenciák csak a megadott táblabeli objektumra mutathatnak. INSERT INTO csapat2 SELECT 'Fradi', REF(sz) FROM szemely_ot sz WHERE nev='Albert Flori'; INSERT INTO csapat2 SELECT 'Ujpest', REF(sz) FROM szemely_ot sz WHERE nev='Bene Feri'; Majd a DEREF függvénnyel, aminek paramétere egy OID, megkaphatjuk az objektumot. SELECT DEREF(vezeto) FROM csapat2 WHERE nev = 'Fradi'; DEREF(VEZETO)(NEV, CIM(UTCA, VAROS, ORSZAG, IRSZAM)) ------------------------------------------------------------------- SZEMELY_TYP('Albert Flori', CIM_TYP('Kicsi', 'Bp', 'Magyar', 5678)) Lógó mutatók, amelyek nem mutatnak sehova. (IS DANGLING) Ezek nem azonosak a NULL mutatóval. INSERT INTO szemely_ot VALUES (szemely_typ('Detari Lajos', cim_typ('Kossuth', 'Baja', 'Magyar', 1357))); INSERT INTO csapat2 SELECT 'Honved', REF(sz) FROM szemely_ot sz WHERE nev='Detari Lajos'; INSERT INTO csapat2 VALUES ('Vasas', NULL); DELETE FROM szemely_ot WHERE nev='Detari Lajos'; SELECT nev, DEREF(vezeto) FROM csapat2 WHERE vezeto is null; NEV ----- Vasas SELECT nev, DEREF(vezeto) FROM csapat2 WHERE vezeto is dangling; NEV ------ Honved Visszatesszük a kitörölt sort, és helyreállítjuk a mutatót. INSERT INTO szemely_ot VALUES (szemely_typ('Detari Lajos', cim_typ('Kossuth', 'Baja', 'Magyar', 1357))); UPDATE csapat2 cs SET vezeto=(SELECT REF(sz) FROM szemely_ot sz WHERE nev='Detari Lajos') WHERE nev='Honved';