Az objektumtábla olyan speciális tábla, ahol minden sor egy-egy objektumot tartalmaz. A következő utasítások például létrehozzák a T_Szemely objektumtípust, majd egy objektumtáblát a T_Szemely objektumok számára:
CREATE TYPE T_Szemely AS OBJECT(
nev VARCHAR2(35),
telefon VARCHAR2(12)
);
/
CREATE TABLE szemelyek OF T_Szemely;
Egy objektumtábla megközelítése kétféle módon történhet:
tekinthetjük olyan táblának, amelynek egyetlen oszlopa van, és ennek minden sorában egy-egy objektum áll, amelyen objektumorientált műveletek végezhetők;
tekinthetjük olyan táblának, amelynek oszlopai az objektumtípus attribútumai, és így a relációs műveletek hajthatók végre rajta.
A REF adattípus
A REF beépített típus sorobjektumok kezelését teszi lehetővé. A REF egy pointer, amely egy sorobjektumot címez. A REF típus használható oszlop, változó, formális paraméter, rekordmező és attribútum típusának megadásánál:
REF objektumtípus [SCOPE IS objektumtábla]
alakban. Ha megadjuk a SCOPE IS előírást, akkor csak az adott objektumtábla sorai, egyébként bármely, az adott objektumtípussal rendelkező objektumtábla sorai hivatkozhatók. A SCOPE IS előírással rendelkező REF típust korlátozott REF típusnak hívjuk.
1. példa
CREATE TABLE hitel_ugyfelek OF T_Szemely;
CREATE TABLE hitelek (
azonosito VARCHAR2(30) PRIMARY KEY,
osszeg NUMBER,
lejarat DATE,
ugyfel_ref REF T_Szemely SCOPE IS hitel_ugyfelek,
kezes_ref REF T_Szemely -- Nem feltétlen ügyfél
)
/
Elképzelhető, hogy egy REF által hivatkozott objektum elérhetetlenné válik (például töröltük vagy megváltozott a jogosultság), ekkor az ilyen hivatkozást érvénytelen hivatkozásnak hívjuk. Az SQL az IS DANGLING logikai értékű operátorral tudja vizsgálni egy REF érvényességét. Az IS DANGLING értéke igaz, ha a hivatkozás érvénytelen, egyébként
hamis.
Egy objektumtáblát a relációs DML utasításokkal hagyományos relációs táblaként kezelhetünk.
2. példa
INSERT INTO szemelyek VALUES ('Kiss Aranka', '123456');
INSERT INTO szemelyek VALUES (T_Szemely('József István', '454545'));
INSERT INTO hitel_ugyfelek VALUES ('Nagy István', '789878');
INSERT INTO hitel_ugyfelek VALUES ('Kocsis Sándor', '789878');
SELECT nev, telefon FROM hitel_ugyfelek;
SELECT * FROM szemelyek;
UPDATE szemelyek SET telefon = '111111'
WHERE nev = 'Kiss Aranka';
UPDATE szemelyek sz SET sz = T_Szemely('Kiss Aranka', '222222')
WHERE sz.nev = 'Kiss Aranka';
Az objektumtáblák sorait mint objektumokat a következő függvényekkel kezelhetjük: VALUE, REF, DEREF, TREAT. Ezek PL/SQL kódban csak SQL utasításokban szerepelhetnek.
VALUE
A VALUE függvény aktuális paramétere egy objektumtábla vagy objektumnézet másodlagos neve lehet és a tábla vagy nézet sorait mint objektumpéldányokat adja vissza. Például a következő lekérdezés azon objektumok halmazát adja, ahol a nev attribútum értéke Kiss Aranka:
SELECT VALUE(sz) FROM szemelyek sz
WHERE sz.nev = 'Kiss Aranka';
A VALUE függvény visszaadja az objektumtábla típusának és minden leszármazott típusának példányait.
Ha azt akarjuk, hogy csak azokat a példányokat kapjuk meg, amelyek legszűkebb típusa a tábla típusa,
használjuk az IS OF operátort ONLY kulcsszóval (lásd később a fejezetben).
REF
A REF függvény aktuális paramétere egy objektumtábla vagy objektumnézet másodlagos neve lehet, és a visszatérési értéke az adott tábla vagy nézet egy objektumpéldányának a referenciája. A REF függvény által visszaadott referencia hivatkozhatja az adott tábla vagy nézet típusának összes leszármazott típusához tartozó példányt is.
Példa
INSERT INTO hitelek
SELECT '767-8967-6' AS azonosito, 65000 AS osszeg,
SYSDATE+365 AS lejarat,
REF(u) AS ugyfel_ref, REF(sz) AS kezes_ref
FROM hitel_ugyfelek u, szemelyek sz
WHERE u.nev = 'Nagy István'
AND sz.nev = 'Kiss Aranka'
;
SELECT * FROM hitelek
DELETE FROM hitel_ugyfelek WHERE nev = 'Nagy István';
SELECT * FROM hitelek WHERE ugyfel_ref IS DANGLING;
DEREF
PL/SQL kódban a referenciák nem használhatók navigálásra. Egy referencia által hivatkozott objektumhoz a DEREF függvény segítségével férhetünk hozzá. A DEREF aktuális paramétere egy referencia, visszatérési értéke az objektum. Érvénytelen referencia esetén a DEREF NULL-al tér vissza.
Példa
SELECT DEREF(ugyfel_ref) AS ugyfel, DEREF(kezes_ref) AS kezes
FROM hitelek;
DELETE FROM hitelek
WHERE DEREF(ugyfel_ref) IS NULL;
TREAT
A TREAT függvény az explicit típuskonverziót valósítja meg. Alakja:
TREAT(kifejezés AS típus)
A kifejezés típusát módosítja típusra. A típus a kifejezés típusának leszármazott típusa. Tehát a TREAT függvény lehetővé teszi az őstípus egy objektumának valamely leszármazott típus példányaként való kezelését (például azért, hogy a leszármazott típus attribútumait vagy metódusait használni tudjuk). Ha az adott objektum nem példánya a leszármazott típusnak, a TREAT NULL-lal tér vissza.
1. példa
CREATE TABLE arucikkek OF T_Arucikk;
INSERT INTO arucikkek VALUES(
T_Kepeslap('Boldog névnapot!', 120, 40, T_Teglalap(15, 10))
);
INSERT INTO arucikkek VALUES(
T_Toll('Filctoll', 40, 140, 'piros', 10, 0.9)
);
INSERT INTO arucikkek VALUES(
T_Toll('Filctoll', 40, 140, 'kék', 10, 0.9)
);
INSERT INTO arucikkek VALUES(
T_Sorkihuzo('Jo vastag sorkihuzo', 40, 140, 'zöld', 10, 0.9, 9)
);
SELECT ROWNUM, TREAT(VALUE(a) AS T_Toll).szin AS szin
FROM arucikkek a;
Az objektumok kezelésénél alkalmazható az IS OF logikai értékét szolgáltató operátor, alakja:
objektum IS OF ([ONLY] típus[,[ONLY] típus]...)
ahol a típus az objektum típusának leszármazott típusa. Az objektumot egy kifejezés szolgáltatja. Az IS OF operátor értéke igaz, ha az objektum az adott típus vagy a típus leszármazott típusainak példánya. Az ONLY megadása esetén csak akkor ad igaz értéket, ha az adott típus példányáról van szó (a leszármazott típusokra már hamis az értéke).
2. példa
SELECT ROWNUM, TREAT(VALUE(a) AS T_Toll).szin AS szin
FROM arucikkek a
WHERE VALUE(a) IS OF (T_Toll);
SELECT ROWNUM, TREAT(VALUE(a) AS T_Toll).szin AS szin
FROM arucikkek a
WHERE VALUE(a) IS OF (ONLY T_Toll);
A TREAT kifejezése és típusa is lehet REF típus.
3. példa
CREATE TABLE cikk_refek (
toll_ref REF T_Toll,
kihuzo_ref REF T_Sorkihuzo
);
INSERT INTO cikk_refek (toll_ref)
SELECT TREAT(REF(a) AS REF T_Toll) FROM arucikkek a;
UPDATE cikk_refek SET kihuzo_ref = TREAT(toll_ref AS REF T_Sorkihuzo);
SELECT ROWNUM, DEREF(toll_ref), DEREF(kihuzo_ref) FROM cikk_refek;