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.
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 ----------------------------------------------