Oracle PL/SQL gyűjtemények: Varrays, Beágyazott és Index táblázatok szerint

Mi az a Gyűjtemény?

A gyűjtemény meghatározott adattípusok elemeinek rendezett csoportja. Ez lehet egyszerű adattípusok vagy összetett adattípusok gyűjteménye (például felhasználó által definiált vagy rekordtípusok).

A gyűjteményben minden elemet egy elnevezésű kifejezés azonosít „aljegyző”. A gyűjtemény minden eleméhez egyedi index tartozik. A gyűjteményben lévő adatok módosíthatók vagy lekérhetők az egyedi indexre hivatkozva.

A gyűjtemények akkor a leghasznosabb dolgok, amikor azonos típusú nagyméretű adatokat kell feldolgozni vagy manipulálni. A gyűjtemények egészben feltölthetők és manipulálhatók a 'BULK' opció használatával Oracle.

A gyűjtemények osztályozása a szerkezet, az alsó index és a tárhely alapján történik, az alábbiak szerint.

  • Index-táblázatok (más néven asszociatív tömb)
  • Beágyazott asztalok
  • Varrays

A gyűjteményben lévő adatokra bármikor hivatkozhatunk három kifejezéssel Gyűjtemény neve, alsó index, mező/oszlop neve, mint „ ( ). ”. Ezekről a fent említett gyűjteménykategóriákról az alábbi részben olvashat bővebben.

Varrays

A Varray egy olyan gyűjtési módszer, amelyben a tömb mérete rögzített. A tömb mérete nem léphető túl a rögzített értékénél. A Varray alsó indexe numerikus érték. Az alábbiakban a Varrays attribútumai olvashatók.

  • A felső határméret rögzített
  • Az „1” alsó indexszel kezdődő sorrendben feltöltve
  • Ez a gyűjteménytípus mindig sűrű, azaz nem tudunk tömbelemeket törölni. A Varray egészében törölhető, vagy a végétől levágható.
  • Mivel természetében mindig sűrű, nagyon kevésbé rugalmas.
  • Célszerűbb akkor használni, ha a tömb mérete ismert, és hasonló tevékenységeket végezni az összes tömbelemen.
  • Az alsó index és a sorrend mindig stabil marad, azaz a gyűjtemény alsó indexe és száma mindig ugyanaz.
  • A programokban való felhasználás előtt inicializálni kell őket. Az inicializálatlan gyűjtemény bármely művelete (kivéve a EXISTS műveletet) hibát jelez.
  • Létrehozható adatbázis-objektumként, amely az egész adatbázisban látható, vagy az alprogramon belül, amely csak abban az alprogramban használható.

Az alábbi ábra diagramszerűen magyarázza el a Varray (sűrű) memóriakiosztását.

index 1 2 3 4 5 6 7
Érték X Y Z Dfv Sde Cxs Vbc Nhu Qwe

A VARRAY szintaxisa:

TYPE <type_name> IS VARRAY (<SIZE>) OF <DATA_TYPE>;
  • A fenti szintaxisban a type_name a 'DATA_TYPE' típusú VARRAY-ként van deklarálva az adott méretkorláthoz. Az adattípus lehet egyszerű vagy összetett.

Beágyazott táblázatok

A beágyazott tábla olyan gyűjtemény, amelyben a tömb mérete nincs rögzítve. Numerikus alsó index típussal rendelkezik. Az alábbiakban további leírás található a beágyazott táblázat típusáról.

  • A beágyazott táblázatnak nincs felső méretkorlátja.
  • Mivel a felső mérethatár nem rögzített, a gyűjteményt, a memóriát minden alkalommal bővíteni kell, mielőtt használnánk. A gyűjteményt az 'EXTEND' kulcsszóval bővíthetjük.
  • Az „1” alsó indexszel kezdődő sorrendben feltöltve.
  • Ez a gyűjteménytípus mindkettőből lehet sűrű és ritka, azaz létrehozhatjuk a gyűjteményt sűrűként, illetve véletlenszerűen törölhetjük is az egyes tömbelemeket, amitől ritka lesz.
  • Nagyobb rugalmasságot biztosít a tömbelem törlésével kapcsolatban.
  • A rendszer a rendszer által generált adatbázistáblában tárolja, és a kiválasztási lekérdezésben használható az értékek lekérésére.
  • Az alsó index és a sorozat nem stabil, azaz az alsó index és a tömbelem száma változhat.
  • A programokban való felhasználás előtt inicializálni kell őket. Az inicializálatlan gyűjtemény bármely művelete (kivéve a EXISTS műveletet) hibát jelez.
  • Létrehozható adatbázis-objektumként, amely az egész adatbázisban látható, vagy az alprogramon belül, amely csak abban az alprogramban használható.

Az alábbi ábra sematikusan magyarázza el a beágyazott tábla (sűrű és ritka) memóriakiosztását. A fekete színű elemtér a gyűjtemény üres, azaz ritka elemét jelöli.

index 1 2 3 4 5 6 7
Érték (sűrű) X Y Z Dfv Sde Cxs Vbc Nhu Qwe
Érték (ritka) Qwe asd Afg asd Wer

Szintaxis a beágyazott táblázathoz:

TYPE <tvpe name> IS TABLE OF <DATA TYPE>;
  • A fenti szintaxisban a type_name 'DATA_TYPE' típusú beágyazott táblagyűjteményként van deklarálva. Az adattípus lehet egyszerű vagy összetett.

Index táblázatonként

A táblázatonkénti index olyan gyűjtemény, amelyben a tömb mérete nem rögzített. A többi gyűjteménytípustól eltérően az indexenkénti gyűjteményben az alsó indexet a felhasználó határozhatja meg. Az alábbiakban az index-táblázat attribútumait mutatjuk be.

  • Az alsó index egész számokból vagy karakterláncokból állhat. A gyűjtemény létrehozásakor meg kell említeni az alsó index típusát.
  • Ezeket a gyűjteményeket nem tároljuk egymás után.
  • Természetükben mindig ritkák.
  • A tömb mérete nem rögzített.
  • Nem tárolhatók az adatbázis oszlopban. Ezeket létre kell hozni és használni kell az adott munkamenet bármely programjában.
  • Nagyobb rugalmasságot biztosítanak az alsó index fenntartása szempontjából.
  • Az alsó indexek negatív alsó indexűek is lehetnek.
  • Alkalmasabbak viszonylag kisebb kollektív értékekhez használni, amelyekben a gyűjtemény inicializálható és ugyanazon alprogramokon belül használható.
  • A használatuk megkezdése előtt nem szükséges inicializálni őket.
  • Nem hozható létre adatbázis-objektumként. Csak az alprogramon belül hozható létre, amely csak abban az alprogramban használható.
  • A BULK COLLECT nem használható ebben a gyűjteménytípusban, mivel az alsó indexet kifejezetten meg kell adni a gyűjtemény minden rekordjához.

Az alábbi ábra vázlatosan ismerteti a beágyazott tábla (ritka) memóriakiosztását. A fekete színű elemtér a gyűjtemény üres, azaz ritka elemét jelöli.

alsó index (varchar) ELSŐ MÁSODIK HARMADIK NEGYEDIK ÖTÖDIK HATODIK HETEDIK
Érték (ritka) Qwe asd Afg asd Wer

Szintaxis az indexenkénti táblázathoz

TYPE <type_name> IS TABLE OF <DATA_TYPE> INDEX BY VARCHAR2 (10);
  • A fenti szintaxisban a type_name 'DATA_TYPE' típusú indexenkénti gyűjteményként van deklarálva. Az adattípus lehet egyszerű vagy összetett. A subsciprt/index változó VARCHAR2 típusú, maximális mérete 10.

Konstruktor és inicializálási koncepció a gyűjteményekben

A konstruktorok az orákulum által biztosított beépített függvények, amelyeknek ugyanaz a neve, mint az objektumnak vagy gyűjteményeknek. Ezeket először hajtják végre, amikor egy munkamenetben először hivatkoznak objektumra vagy gyűjteményekre. Az alábbiakban a konstruktor fontos részletei találhatók gyűjteménykörnyezetben:

  • Gyűjtemények esetén ezeket a konstruktorokat kifejezetten meg kell hívni az inicializáláshoz.
  • A Varray és a Nested táblákat is inicializálni kell ezeken a konstruktorokon keresztül, mielőtt a programba utalnák.
  • A Constructor implicit módon kiterjeszti egy gyűjtemény memóriafoglalását (a Varray kivételével), így a konstruktor a változókat is hozzárendelheti a gyűjteményekhez.
  • Ha a gyűjteményhez értékeket rendelünk a konstruktőrökön keresztül, akkor a gyűjtemény soha nem lesz ritka.

Gyűjtési módszerek

Oracle számos funkciót biztosít a gyűjtemények kezeléséhez és kezeléséhez. Ezek a függvények nagyon hasznosak a programban a gyűjtemények különböző attribútumainak meghatározásához és módosításához. Az alábbi táblázat a különböző funkciókat és azok leírását tartalmazza.

Módszer Leírás SZINTAXIS
LÉTEZIK (n) Ez a módszer logikai eredményeket ad vissza. 'TRUE'-t ad vissza, ha az nth elem létezik a gyűjteményben, különben FALSE-t ad vissza. Az inicializálatlan gyűjtésben csak a EXISTS függvények használhatók .EXISTS(elem_pozíció)
COUNT Megadja a gyűjteményben található elemek teljes számát .SZÁMOL
LIMIT A gyűjtemény maximális méretét adja vissza. A Varray esetében a megadott rögzített méretet adja vissza. Beágyazott tábla és Index-táblázat esetén NULL értéket ad .HATÁR
ELSŐ A gyűjtemények első indexváltozójának (alindexének) értékét adja vissza .ELSŐ
LAST A gyűjtemények utolsó indexváltozójának (alindexének) értékét adja vissza .UTOLSÓ
ELŐZŐ (n) A visszatérési érték megelőzi az indexváltozót az n gyűjteményébenth elem. Ha nincs előtte indexérték, NULL-t ad vissza .PRIOR(n)
KÖVETKEZŐ (n) A sikeres indexváltozót adja vissza az n gyűjteményébenth elem. Ha nincs sikeres indexérték, a NULL értéket ad vissza .KÖVETKEZŐ(n)
KITERJESZT A végén kiterjeszti a gyűjtemény egy elemét .KITERJESZT
KITERJESZTÉS (n) Bővíti n elemet a gyűjtemény végén .EXTEND(n)
KITERJESZTÉS (n,i) Bővíti n példányt az ith elem a gyűjtemény végén .EXTEND(n,i)
TRIM Eltávolít egy elemet a gyűjtemény végéről .TRIM
VÁGÁS (n) Eltávolít n elemet a gyűjtés végéről .TRIM (n)
DELETE Törli az összes elemet a gyűjteményből. Üressé teszi a gyűjteményt .TÖRÖL
TÖRLÉS (n) Törli az n-edik elemet a gyűjteményből. Ha akkorth elem értéke NULL, akkor ez nem tesz semmit .DELETE(n)
TÖRLÉS (m,n) Törli az m tartomány elemétth hogy nth a gyűjteményben .DELETE(m,n)

Példa 1: Rekordtípus alprogram szinten

Ebben a példában látni fogjuk, hogyan lehet feltölteni a gyűjteményt a "ÖSSZES GYŰJTÉSés hogyan hivatkozhat a gyűjtési adatokra.

Felvétel típusa alprogram szinten

DECLARE
TYPE emp_det IS RECORD
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
TYPE emp_det_tbl IS TABLE OF emp_det; guru99_emp_rec emp_det_tbl:= emp_det_tbl(); 
BEGIN
INSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1000,’AAA’,25000,1000);
INSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1001,'XXX’,10000,1000);
INSERT INTO emp (emp_no, emp_name, salary, manager) VALUES (1002,'YYY',15000,1000);
INSERT INTO emp (emp_no,emp_name,salary, manager) VALUES (1003,’ZZZ’,'7500,1000);
COMMIT:
SELECT emp no,emp_name,manager,salary BULK COLLECT INTO guru99_emp_rec
FROM emp;
dbms_output.put_line (‘Employee Detail');
FOR i IN guru99_emp_rec.FIRST..guru99_emp_rec.LAST
LOOP
dbms_output.put_line (‘Employee Number: '||guru99_emp_rec(i).emp_no); 
dbms_output.put_line (‘Employee Name: '||guru99_emp_rec(i).emp_name); 
dbms_output.put_line (‘Employee Salary:'|| guru99_emp_rec(i).salary); 
dbms_output.put_line(‘Employee Manager Number:'||guru99_emp_rec(i).manager);
dbms_output.put_line('--------------------------------');
END LOOP;
END;
/

Kód magyarázata:

  • Kódsor 2-8: Rekord típusa Az 'emp_det' az emp_no, emp_name, fizetés és a NUMBER, VARCHAR2, NUMBER, NUMBER adattípusú kezelő oszlopokkal van deklarálva.
  • 9. kódsor: Az 'emp_det' rekord típusú elem 'emp_det_tbl' gyűjteményének létrehozása
  • 10. kódsor: A 'guru99_emp_rec' változó deklarálása 'emp_det_tbl' típusúként, és null konstruktorral inicializálva.
  • 12-15. kódsor: A mintaadatok beillesztése az 'emp' táblába.
  • 16. kódsor: Beillesztési tranzakció véglegesítése.
  • 17. kódsor: A rekordok lekérése az „emp” táblából, és a gyűjteményváltozó tömeges feltöltése a „BULK COLLECT” paranccsal. Most a 'guru99_emp_rec' változó tartalmazza az összes rekordot, amely az 'emp' táblában található.
  • 19-26. kódsor: A 'FOR' ciklus beállítása a gyűjtemény összes rekordjának egyenkénti kinyomtatásához. Az ELSŐ és UTOLSÓ gyűjtési módszer alsó és felső határaként használatos hurok.

teljesítmény: Amint a fenti képernyőképen látható, amikor a fenti kódot végrehajtják, a következő kimenetet kapja

Employee Detail
Employee Number: 1000
Employee Name: AAA
Employee Salary: 25000
Employee Manager Number: 1000
----------------------------------------------
Employee Number: 1001
Employee Name: XXX
Employee Salary: 10000
Employee Manager Number: 1000
----------------------------------------------
Employee Number: 1002
Employee Name: YYY
Employee Salary: 15000
Employee Manager Number: 1000
----------------------------------------------
Employee Number: 1003
Employee Name: ZZZ
Employee Salary: 7500
Employee Manager Number: 1000
----------------------------------------------