Objektumtáblák

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:

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;