A PL/SQL programozási nyelv

Absztrakt adattípusok

AZ Absztrakt típusok fajtái

Az ORACLE következő eszközökkel támogatja az ADT-t:

  1. Objektumtípusok
  2. Beágyazott táblák (nested table)--IS TABLE OF ...
  3. Változtatható méretű tömbök --IS VARRAY OF..
  4. Asszociatív tömbök --TABLE OF .. INDEX BY
  5. Befejezetlen objektum típus

Általános leírás az egyes fajtákról

A nyelv támogatja az ADT definíciókat így vált az ORACLE objektumrelációs adatbázis-kezelő rendszerré az ORACLE8 –tól kezdve. Mivel ez a rész kapcsolódik az objektum-orientált programozáshoz lásd még itt: OOP
Az absztrakt adattípus egy olyan típus, amely több altípust tartalmaz, ezek lehetnek beépített Oracle adattípusok (NUMBER,VARCHAR2) vagy korábban definiált absztrakt típusok.Az adattípus konstrukciókat hagyományosan attribútumoknak, a rajtuk műveletet végző alprogramokat pedig metódusoknak nevezzük. ADT-k is mint minden más adat az Oracle-ben adatbázisban tárolódnak, amihez jogosultságok megadásával lehet hozzáférni. CREATE,ALTER,DROP DML műveleteken keresztül lehet állapotukat megváltoztatni. Egy ADT példány lehet táblában is tárolni és használni mint egy standard változót. ADT segítségével a nagyobb programok komplexitását lehet csökkenteni azáltal, hogy kisebb és újrafelhasználható részekre bontjuk a projectet. Más szakirodalmak használják a felhasználói típust, vagy objektum típust is az ADT szinonimájaként.

Mind a beágyazott táblák, mind a dinamikus tömb típusok speciális objektumtípusoknak tekinthetők az ORACLE-ben. Egy attribútumuk van, amelynek típusával hozzuk létre az objektum deklarácíóját. Nem adhatunk meg explicit metódusokat, de az ORACLE implicit módon felépít hozzájuk különböző kezelő metódusokat. Példányosítás megengedett. Tartozik hozzájuk konstruktor amit a példányosítás során hívunk meg, aktuális paraméterekkel. Az öröklődés nem értelmezett rajtuk. Minden objektumtípus csak akkor cserélhető le CREATE OR REPLACE TYPE utasítással, ha nincsenek altípusai, leszármazottjai. Az ORACLE gyűjteményekhez tartozik a asszociatív tömb, a beágyazott tábla és a dinamikus (vagy változó méretű) tömb típus amit más szakirodalmak kollekcióknak is neveznek. A gyűjteményeknek komponenseinek mindig azonos típusú elemei vannak. Az ORACLE rendelkezik még RECORD típussal is aminek komponensei különböző típusuak lehetnek, a táblákhoz hasonlóan FIELD-nek nevezzük őket.

A kollekciót explicit módon inicializálni az objektumtípusnak megfelelően példányosítással lehet. A példányosításhoz az adott típus konstruktorát kell meghívni. A konstruktor egy rendszer által létrehozott függvény, amelynek neve megegyezik a típus nevével, paramétereinek száma tetszőleges, paraméterei típusának a megfelelő kollekciótípus elemeinek típusával kompatibilisnek kell lennie. A dinamikus tömb konstruktorának maximum annyi paraméter adható meg, amennyi a deklarált maximális elemszám. A konstruktor meghívható paraméterek nélkül, ekkor egy üres kollekció jön létre. Javasolt, hogy a kollekció deklarálásakor hajtsunk végre explicit inicializálást, itt hívjuk meg a konstruktort.

A gyűjtemények mindig egydimenziósak és indexeik egész típusúak, kivéve az asszociatív tömböt, amely indexelhető sztringgel is. A többdimenziós tömböket olyan gyűjteményekkel tudjuk kezelni, melyek elemei maguk is gyűjtemények. A beágyazott táblák és a dinamikus tömbök elemei lehetnek objektumtípus példányai és ők lehetnek objektumtípus attribútumai. A gyűjtemények átadhatók paraméterként, így segítségükkel adatbázis tábláinak oszlopai mozgathatók az alkalmazások és az adatbázis között.

Gyűjtemények metódusai
Az objektumtípusú gyűjtemények esetén a PL/SQL implicit módon metódusokat definiál, ahogy ezt a fejezet bevezetőjében már említettük.. Ezen metódusok egy része asszociatív tömb esetén is használható. Ezek a metódusok csak procedurális utasításokban hívhatók, SQL utasításokban nem. A metódusok áttekintését szolgálja a következő táblázat

Metódus Visszatérési típus Tevékenység Gyűjtemény

EXISTS

BOOLEAN

Igaz értéket ad, ha az adott indexű elem létezik a kollekcióban.

Minden kollekció

COUNT

NUMBER

Visszaadja a kollekció elemeinek számát.

Minden kollekció

LIMIT

NUMBER

Visszaadja a kollekció maximális méretét.

Minden kollekció

FIRST

indextípus

Visszaadja a kollekció első elemének indexét.

Minden kollekció

LAST

indextípus

Visszaadja a kollekció utolsó elemének indexét.

Minden kollekció

NEXT

indextípus

Visszaadja egy megadott indexű elemet követő elem indexét.

Minden kollekció

PRIOR

indextípus

Visszaadja egy megadott indexű elemet megelőző elem indexét.

Minden kollekció

EXTEND

nincs

Bővíti a kollekciót.

Beágyazott tábla, dinamikus tömb

TRIM

nincs

Eltávolítja a kollekció utolsó elemeit.

Beágyazott tábla, dinamikus tömb

DELETE

nincs

A megadott elemeket törli a kollekcióból.

Asszociatív tömb, beágyazott tábla, dinamikus tömb esetén csak para­méter nélkül

Object típus

Az Oracle osztályfogalmának az OBJECT típus felel meg. Amely CREATE TYPE name AS OBJECT(.....); deklarációfal vezetünk be. Két részre oszlik specifikációs részre és törzsrészre, ami lehetővé teszi ,hogy a megvalósítási részt a definíciójuk nélkül külön fordítsunk,újradefiniáljunk.
Objektum specifikációs része:

CREATE [OR REPLACE] TYPE típusnév
[AUTHID {CURRENT_USER|DEFINER}]
{{IS|AS} OBJECT|UNDER szupertípus_név}
( {attribútum adattípus|metódus_spec}
[,{attribútum adattípus|metódus_spec} ] …)
[ [NOT] FINAL] [ [NOT] ISTANTIABLE];

Metódus specifikációs része:

[ [NOT] OVERRIDING] [ [NOT] FINAL] [ [NOT] INSTANTIABLE]
[ {MAP|ORDER} MEMBER FV_SPEC]
{MEMBER|STATIC|CONSTRUCTOR} alprogram_spec]

Az objektum törzse:

CREATE [OR REPLACE] TYPE BODY típusnév
{IS|AS}
{MEMBER|STATIC|CONSTRUCTOR} alprogramdeklaráció ;
[{MEMBER|STATIC|CONSTRUCTOR} alprogramdeklaráció ; ]...
[ {MAP|ORDER} MEMBER fv_deklaráció]
END;

Az öröklődés

Az Oracle az egyszeres öröklés elvét valósítja meg.
A Object olyan objektumtípust definiál, amelynek nincs szupertípusa. Ez a típus egy önálló objektumtípus-hierarchia gyökértípusa lehet. Az UNDER a megadott szupertípus altípusaként származtatja a típust, tehát beilleszti abba az objektumtípus-hierarchiába,amelyben a szupertípus is van Az Oracle-ban nincs eszköz az attribútumok láthatósági megkötésére , tehát minden amit az objektum egységbezár az nyilvános mind a példány objektumok mind pedig az öröklődés után az altípusok számára.. A nyelv támogatja a polimorfizmust az OVERRIDING módosítóval, és absztrakt osztályok definícióját a NOT INSTANTIABLE módosítóval, a metódusok túlterhelhetők ha nevük és visszatérési típusúk megegyezik csak a paraméterek számában és típusában különböznek. A szintaktikus leírás végén (a kerek zárójelek után) szereplő előírások az objektumtípus öröklődését és példányosítását szabályozzák. Ezek az előírások a metódusokra is ugyanúgy alkalmazhatóak.
FINAL (alapértelmezett) : az adott objektumtípusból nem származtatható altípus. Ez a típus az öröklődési fa levéleleme lesz. NOT FINAL : Öröklődéssel származtathatunk altípust. INSTANTIABLE (alapértelmezett) az objektumtípus példányosítható. NOT INSTANTIABLE : absztrakt objektumtípus. Ez az előírás kötelező ha az objektum absztrakt metódust tartalmaz. Ekkor az objektumnak nincs konstruktora. Kötelező még ilyenkor a NOT FINAL megadása is. Az attribútumok és metódusoknál az azonosító nevek öröklődés esetén egyedinek kell lennie az öröklődési fában.

A metódusokra vonatkozó megkötések:

A metódusok lehetnek eljárások vagy függvények. Az attribútumok után kell megadni a specifikációjukat az OBJECT fejrészében, majd a definíciójukat a törzsben kell megadni. A metódusok definíciója megegyezik az előző fejezetekben leírtakkal, beleértve a paraméterek típusát , és a paraméterátadások fajtáit is. A definíciójukat a BEGIN END; utasítás zárójelek között adjuk meg. Kivételt képez ha NOT INSTANTIABLE módosítóval ellátott metódus mert ez azt jelzi a fordítónak ,hogy absztrakt. Ilyen esetben törzs nélkül is szerepelhet osztály specifikáció. Az OVERRIDING polimorf metódusoknál kötelező a definíció. Azt jelöli, hogy az adott metódus újraimplementálja a szupertípus megfelelő metódusát. Az alapértelmezés NOT OVERRIDING. A FINAL azt határozza meg, hogy az adott metódus nem polimorf, és az altípusokban nem implementálható újra. AZ alapértelmezés NOT FINAL. A MEMBER metódusok az Oracle-ben példány szintű metódusok. Ezek mindig az aktuális példányon operálnak. Első paraméterük implicit módon mindig a SELF, amely az aktuális példányra hivatkkozik.De megadható explicit is mindig a formális paraméterlista első elemeként. IN OUT eljárás esetén , IN függvény esetén az átadási mód.

Statikus osztálytagok:

Mint más OOP támogató nyelvekben is a PL/SQL is tartalmaz nyelvi eszközt az osztályszintű metódusokra a STATIC módosítóval. Ezeknek a metódusoknak nincs SELF paramétere. Az osztály adattagjain végeznek műveletet, amely minden példányon egyformán érvényes lesz.

Konstruktorok:

A konstruktor olyan függvény amely neve megegyezik az OBJECT-ben deklarálttal és előtte a CONSTRUCTOR módosító szerepel és visszatérése a RETURN SELF AS RESULT kulcsszóval történik. A PL/SQL rendelkezik alapértelmezett konstruktorral amelynek formális paraméterei megegyeznek az sorrendben,típusban is attribútumokban definiáltakkal. A konstruktorhívást expliciten kell megadni., amely inicializálja az attribútumokat a megadott aktuális paraméterekkel és visszatér az objektum példányával. A konstruktor is rendelkezik SELF paraméterrel ami alapértelmezés szerint IN OUT típusú. A konstruktorok nem öröklődnek, de túlterhelhetőek. A konstruktorhívást megelőzheti a NEW kulcsszó.

Rendező operátorok:

A MAP vagy ORDER módosító a MEMBER metódusoknál azt jeleni ,hogy a PL/SQL csak az egyenlőséget és a nem egyenlő műveleteket definiálja két objektum összehasonlítására tehát a sorba rendezésre műveletfüggvényeket kell definiálni, hasonlóan más nyelvek absztrakt adattípusaihoz. Ha két objektumpéldány azonos akkor adattagjaik páronként megegyeznek. Különböző típusú objektumokat nem lehet összehasonlítani. Ha altípus nem ad meg MAP vagy ORDER definíciót akkor a szupertípusban definiált lesz az érvényes. MAP típus újraimplementálható de az ORDER nem. A MAP MEMBER függvény visszatérési típusa skalár , amely érték minden összehasonlított elemre Hash függvénnyel képződik. AZ ORDER MEMBER függvény visszatérési típusa NUMBER vagy altípusa, értéke negatív,nulla, vagy pozitív attól függően, hogy az explicit módon megadott objektumpéldányhoz képest ,hogyan rakható sorrendbe.

Beágyazott tábla

TYPE név IS TABLE OF elemtípus [NOT NULL];

A beágyazott tábla egy tábla egy másik táblán belül. A beágyazott tábla tétszőleges sok sor olyan együttese, amely egy másik tábla (a főtábla) egy oszlopában jelenik meg. A főtábla minden sorában a beágyazott tábla akárhány sora megjelenhet. A beágyazott tábla lehetőséget ad arra, hogy egyetlen táblában jelenítsünk meg egy EGY-TÖBB kapcsolatot. Tekintsünk egy olyan példát, amely részlegekről tartalmaz információkat. Minden részlegnél több projekt futhat egy időben. Egy szigorú relációs modellben ez a szituáció csak két táblával (RÉSZLÉG és PROJEKT) lenne modellezhető, amelyek között egy külső kulcs teremtene kapcsolatot. A beágyazott tábla segítségével viszont a projektek információit tárolni tudjuk a RÉSZLÉG táblában. Ezáltal közvetlenül le lehet kérdezni mind a részleg, mind a projekt információit anélkül, hogy összekapcsolást kellene végrehajtani.
Például, ha a tenyésztőkről és az állataikról akarunk információkat tárolni, akkor ezt megtehetjük egyetlen táblában.

create or replace type ALLAT_T1PUS as object
(Fajta VARCHAR2(25),Név VARCHAR2(25),SzulDatum DATE);

Ezzel a típussal hozzunk létre egy beágyazott-tábla-típust:

create type ALLAT_BT as table of ALLAT_TIPUS;

Látjuk, hogy a beágyazott tábla a create type parancs as table utasításrészével hozható létre. Az ALLAT_BT egy absztrakt adattípus lesz. Használjuk fel ezt a típust:

create table TENYESZTOK
(TenyesztoNev VARCHAR2(25),Állatok ALLAT_BT)
nested table ALLATOK store as ALLATOK_BT_TABLA;

A TENYESZTOK tábla Állatok oszlopa egy beágyazott tábla lesz. Ha egy beágyazott táblát hozunk létre, akkor a create table utasításban meg kell adni egy táblát, amely tábla a beágyazott tábla adatait tárolni fogja (itt ez most az ALLATOKBTTABLA). A beágyazott tábla adatait tehát az ORACLE egy külön táblában tárolja. A két tábla között mutatók teremtenek kapcsolatot.

Rekordok beszúrása egy beágyazott táblába

Egy beágyazott táblába történő beszúrásnál a tábla adattípusának konstruktorát kell használni. Az Állatok oszlop típusa ALLATBT, így az ALLATBT konstruktort kell használni. Az ALLAT_BT típus viszont az ALLAT TIPUS típuson alapul, így a konstruktorok egymásba ágyazódnak.

insert into TENYESZTOK values ('KISS ARANKA',
ALLAT_BT(
ALLAT_TIPUS('KUTYA','BODRI','31-MAR-99'),
ALLAT_TIPUS('KUTYA','VIKI','15-JUN-99'),
ALLAT_TIPUS('KUTYA','PAJTI','25-MAR-99')));

A parancs a TENYESZTOK táblába egy sort szúr be, ennek a második oszlopában egy olyan tábla jelenik meg, amelynek három oszlopa és három sora van. Ha nem tudjuk pontosan a tábla szerkezetét, akkor az adatszótárnézetek lekérdezésével juthatunk információhoz. Először kérdezzük le a USER TAB COLUMNS nézetet, hogy megismerjük az oszlopinformációkat:

select Column_Name, Data_Type from USER_TAB_COLUMNS where Table_Name='TENYESZTOK' ;

COLUMN NAME DATA TYPE
TENYESZTONEV VARCHAR2
ALLATOK ALLAT_BT

Az ALLAT_BT típus ellenőrzéséhez használjuk a USER TYPES nézetet:

select TypeCode, Attributes from USERJTYPES where TypeName='ALLAT_BT';

Beágyazott táblák lekérdezése

A változótömbbel szemben a beágyazott tábla lekérdezése sokféleképpen megtehető. Igen lényeges szempont viszont, hogy a beágyazott tábla egy oszlopa egy másik táblának. Az ORACLE a beágyazott tábla kezelésére a select parancsban bevezeti a THE kulcsszót.

select BT.SzulDatum
from THE (select Állatok from TENYESZTOK where TenyesztoNev='KISS ARANKA') BT where BT.Nev='BODRI';

SZULDATUM
31-MAR-99

A THE után egy alkérdés áll, amely a főtáblából kérdezi le a beágyazott táblát. A külső kérdés aztán már azt mint táblát kezeli. A THE utasításrész használható a táblába való beszúrásnál és módosításnál is. Egy beágyazott táblába lehet úgy sort beszúrni, hogy a főtábla sorainak száma nem változik. A példában ez egy létező tenyésztő állatainak számát gyarapítja:

insert into
THE (select Állatok from TENYESZTOK where TenyesztoNev='KISS ARANKA')
values (ALLAT_TIPUS('KUTYA', 'KICSI', '01-AUG-99'));

A THE utasításrész most a táblanév helyett áll, és a beágyazott tábla a beszúrás céltáblája) meghatározását szolgálja. A főtábla és a beágyazott tábla egy időben történő kezelésére (amikor például úgy akarunk beszúrni egy sort, hogy az altáblába beviendő érték egy, már a főtáblában elhelyezett másik sor értékein alapszik) az ORACLE bevezeti a CAST és a MULTISET kulcsszavakat a következő jelentéssel. A cast lehetővé teszi, hogy egy lekérdezés eredményét beágyazott-tábla-típusú oszlop értékeként tekintsük. A multiset a cast-en belül alkalmazva azt jelzi, hogy a lekérdezés eredménye több azonos sorból is állhat. Tekintsük azt a példát, amikor a KISS ARANKA nevű tenyésztő be akar vonni egy ügyfelet a munkájába. Ekkor a TENYESZTOK táblát a következő módon lehet bővíteni:

insert into TENYESZTOK values ('NAGY JUDIT',
cast(multiset(select *from
THE (select Állatok from TENYESZTOK
Where TenyesztoNev='KISS ANKA'))
as ALLAT_BT));

Dinamikus tömb vagy változótömb típus

TYPE név IS {VARRAY | VARYING ARRAY} (maxméret)
OF elemtípus [NOT NULL];

A név a kollekciótípus neve, amelyet ezen deklaráció után tetszőleges kollekció deklarációjában használhatunk típusként az alábbi módon: kollekciónév kollekciótípus_név; A maxméret pozitív egész literál, a dinamikus tömb indexeinek felső határát adja meg. Az elemtípus egy PL/SQL adattípus, amely beágyazott táblánál nem lehet REF CURSOR.

Egy dinamikus tömb típusának deklarációjánál meg kell adni egy maximális méretet, ami rögzíti az indexek felső határát. Az adott típusú dinamikus tömb ezután változó számú elemet tartalmazhat, a nulla darabtól a megadott maximális értékig. Egy dinamikus tömbben az elemek mindig folytonosan, a kisebb indexű „helyeken" helyezkednek el. Egy dinamikus tömb bővíthető (a maximális méretig) új elemmel a végén, de az egyszer bevitt elemek nem törölhetők, csak cserélhetők. Dinamikus tömb típusú oszlop értékei 4K méret alatt a táblában, efölött ugyanazon táblaterület egy külön helyén, egy tárolótáblában tárolódnak. Egy tábla létrehozásakor egy oszlop típusa lehet változótömb.

Egy tábla létrehozásakor egy oszlop típusa lehet változótömb. A változótömb lehetőséget ad arra, hogy ismétlődő csoportot tudjunk kezelni egy táblában (nem normalizált táblát tudunk így kezelni). Például legyen egy PROJEKT táblánk, és tételezzük fel, hogy egy projekten több dolgozó is dolgozik és egy dolgozó több projekten is dolgozhat. Egy szigorú értelemben vett relációs implementációban három táblát kellene létrehozni: a PROJEKT, a DOLGOZO és a közöttük kapcsolatot létesítő PROJEKT DOLGOZO táblákat.A változótömb viszont lehetőséget nyújt arra, hogy a PROJEKT táblában tároljuk a dolgozók nevét. Ha egy projekten tíz vagy annál kevesebb dolgozó dolgozik, akkor létrehozhatunk egy tízhosszúságú változótömböt, amely a dolgozók nevét tartalmazza, és a PROJEKT táblában definiálhatunk egy ilyen típusú oszlopot. Ezután a projekten dolgozók nevét lekérdezhetjük anélkül, hogy a DOLGOZO táblához fordulnánk.

create type ESZKOZ_VA as varray(5) of VARCHAR2(25) ;

Egy változótömb objektumtípuson vagy beépített ORACLE típuson alapulhat. A változótömb tekinthető egy olyan táblának, amely egyetlen oszloppal rendelkezik és benne a sorok száma korlátozott.A létrehozás után a változótömb használható tábladefinícióban és objektumtípus létrehozásánál. A változótömb használatához vagy a tulajdonosának kell lennünk, vagy rendelkeznünk kell a rá vonatkozó EXECUTE privilégiummal.

create table KÖLCSÖNZÉS
(Név VARCHAR2(25) primary key,Eszkoz ESZKOZ_VA) ;

A KÖLCSÖNZÉS tábla ilyen definíciója azt eredményezi, hogy minden sor Eszkoz oszlopa több (maximum 5) értéket tartalmazhat. Az ORACLE a változótömböket RAW típusú adatként tárolja. Erről a describe parancs segítségével is meggyőződhetünk.

Elem beszúrása változótömbbe

Miután a változótömb is egy absztrakt adattípus, az ORACLE hozzá is automatikusan felépíti a konstruktőr módszert. Ha adatokat akarunk beszúrni egy változótömbbe, ezt kell használnunk. Ugyancsak használni kell a konstruktort egy olyan táblába való beszúrásnál is, amely tábla tartalma: változó tömböt.
A következő példa a KÖLCSÖNZÉS táblába visz be egy sort:

insert into KOLCSONZES values
('KISS Zoltan',ESZKOZ_VA('Kes', 'Villa','Ollo'));

Az insert parancs előbb megadja a Név oszlop értékét. Ez egy beépített t ípusú oszlop, az érték egy literál. A KÖLCSÖNZÉS tábla második oszlopa viszont változótömb-típusú, az értékének megadásához használni kell az ESZKOZVA konstruktőr módszert. Mivel a változótömb mérete 5, ezért a konstruktornak maximum öt paramétert adhatunk meg. Jelenleg hármat adtunk, tehát két eleme nem rendelkezik értékkel. Valamely változótömb elem értékének NULL értékre állítása itt is explicit módon (a NULL érték megadásával) történik. Ha egy rekordot beszúrunk egy változótömbbe, biztosnak kell lennünk abban, hogy a megadott értékek száma nem haladja meg a méretét. A változótömb maximális mérete lekérdezhető a USERCOLLTYPES adatszótárnézetből. A változótömbökről közvedenül is kaphatunk információkat a változótömböket kezelő függvények segítségével: a LIMIT függvény a maximális, a COUNT függvény az aktuális elemszámot adja vissza.

Adat lekérdezése változótömbökből

Egy változótömb közvetlenül egy select utasítással nem kérdezhető le. A COUNT, LIMIT értékek és a tényleges adatok lekérdezéséhez PL/SQL-t kell használni. Egy változótömb lekérdezéséhez kurzor FÓR ciklust kell használni, ahogy azt a következő példa mutatja:

set serveroutput on
DECLARE
cursor kolcsonzes_kurzor is SELECT * FROM KÖLCSÖNZÉS;
kolcsonzes_rekord kolcsonzes_kurzor%ROWTYPE;
BEGIN
FOR kolcsonzes_rekord in kolcsonzes_kurzor
LOOP
DBMS_OUTPUT.PUT_LINE('Kölcsönző neve:'||kolcsonzes_rekord.Nev);
FOR i IN 1..kolcsonzes_rekord.Eszkoz.Count
LOOP
DBMS_OUTPUT.PUT_LINE(kolcsonzes_rekord.Eszkoz(i));
END LOOP;
END LOOP;
END;

A fenti PL/SQL kód eredménye:
Kölcsönző neve: KISS Zoltan
kes
villa
ollo

A kiírásra a DBMS_OUTPUT csomag PUTLINE eljárását használtuk ezért a kód elején engedélyezni kell a rendszerkimenet használatát (set serveroutput on). A deklarációs részben egy kurzor és egy rekordváltozó található. A végrehajtható rész két egymásba skatulyázott ciklus segítségével dolgozza fel az összes sort és a sorokon belül a változótömb elemeit. A belső ciklusba: láthatunk példát a COUNT függvény használatára. Az Eszkoz(i) hivatkozás a változótömb i-edik elemét jelenti.

Asszociatív tömb:

TYPE név IS TABLE OF elemtípus [NOT NULL] INDEX BY indextípus;

Az indextípus egy PLSI_INTEGER, BINARY_NTEGER vagy VARCHAR2 típus vagy altípus specifikáció. Az asszociatív tömb lényegében egy hash tábla, indexei (amelyek itt a kulcs szerepét játsszák) tetszőleges egészek vagy sztringek lehetnek. A beágyazott tábla és dinamikus tömb indexeinek alsó határa 1. Az asszociatív tömb esetén az indexeknek sem az alsó, sem a felső határa, beágyazott táblánál a felső határ nem rögzített. Mindhárom gyűjteménytípus deklarálható PL/SQL blokk, alprogram és csomag deklarációs részében, a beágyazott tábla és dinamikus tömb típusok létrehozhatók adatbázis objek¬tumokként is a CREATE TYPE utasítással. Az asszociatív tömb csak a PL/SQL programokban használható, a másik két gyűjteménytípus viszont lehet adatbázistábla oszlopának típusa is. Ilyen beágyazott tábla az ügyfél tábla könyvek oszlopa, és ilyen dinamikus tömb a könyv tábla szerző oszlopa. Asszociatív tömbök esetén egy i indexű elemnek történő értékadás létrehozza az adott elemet, ha eddig még nem létezett, illetve felülírja annak értékét, ha az már létezik. Beágyazott tábla és dinamikus tömb esetén biztosítani kell, hogy az adott indexű elem létezzen az értékadás előtt. Az i indexű elemre való hivatkozás csak a létrehozása után lehetséges, különben a NO_DATA_FOUND kivétel váltódik ki.

Asszociatív tömb, BINARY_INTEGER index

TYPE t_kolcsonzesek_at_binint IS TABLE OF kolcsonzes%ROWTYPE INDEX BY BINARY_INTEGER;

Asszociatív tömb, PLS_INTEGER index, szerkezete egyezik az előző típussal, de nem azonos típus

TYPE t_kolcsonzesek_at_plsint IS TABLE OF kolcsonzes%ROWTYPE INDEX BY PLS_INTEGER;

Asszociatív tömb, VARCHAR2 index, nem rekord típusú elemek

TYPE t_konyv_idk_at_vc2 IS TABLE OF könyv.id%TYPE INDEX BY könyv.isbn%TYPE;

Értékadás karakteres indexű asszociatív tömb egy elemének.

SELECT id INTO v_Konyv_id_by_ISBN(v_ISBN)
FROM könyv WHERE isbn = v_ISBN

Befejezetlen objektum típus

A befejezetlen objektum típus (Incomplet object type) tulajdonképpen egy előrevetett típus definíció. Azért befejezetlen típus mert van azonosítója de nincsenek attribútumai és metódusai. De lehet rá hivatkozni más típusokból, megengedi azt ,hogy a típusok hivatkozzanak egymásra. Feltétel az ,hogy mielőtt használatba vennénk a típust definiálni kell adattagjait. Felhasználhatjuk tábla oszlop típusa készítésnél, beágyazott tábla oszlopának adattípusaként vagy objektum attribútumaként.