Oracle PL/SQL gyűjtemények: Varrays, Beágyazott és Index táblázatok szerint
⚡ Okos összefoglaló
A PL/SQL gyűjtemények azonos adattípusú elemek rendezett csoportjai, amelyek mindegyikét egy alsó index éri el. Három típus – a Varray, a beágyazott tábla és az indexelt tábla – abban különbözik, hogy a méretük rögzített, hogyan működik az alsó index, és hogy tárolhatók-e az adatbázisban.
Mi az a gyűjtemény?
A gyűjtemény egy adott adattípus elemeinek rendezett csoportja. Lehet egyszerű adattípusú vagy összetett adattípusú, például felhasználó által definiált vagy rekordtípusok gyűjteménye.
Egy gyűjteményben minden elemet egy úgynevezett fogalom azonosít. „aljegyző”. Minden elemhez egyedi előindex tartozik, és az adatok erre az egyedi előindexre hivatkozva manipulálhatók vagy kinyerhetők.
A gyűjtemények akkor a leghasznosabbak, ha nagy mennyiségű, azonos típusú adatot kell feldolgozni vagy manipulálni. A gyűjtemények egyben feltölthetők és manipulálhatók a 'TÖMEGES' opció használatával a ... részben. Oracle.
A gyűjtemények struktúrájuk, indexük és tárolási helyük alapján vannak osztályozva, az alábbiak szerint:
- Indexeléses táblázatok (más néven asszociatív tömbök)
- Beágyazott asztalok
- Varrays
Egy gyűjteményben lévő adatokra bármikor három kifejezéssel lehet hivatkozni: gyűjteménynév, alsó index, valamint mező- vagy oszlopnév, ahogy „ ( ). „”. Az alábbi szakaszokban megismerkedhet ezekkel a gyűjteményi kategóriákkal.
Gyűjteménytípusok áttekintése
A három gyűjteménytípus eltérő kompromisszumokat igényel. Az alábbi táblázat egymás mellé helyezi őket, mielőtt részletesen tárgyalnánk őket.
| Aspect | Varray | Beágyazott tábla | Táblázat szerinti indexelés |
|---|---|---|---|
| Méret | Fix felső határ | No limit | No limit |
| index | Numerikus | Numerikus | Egész szám vagy karakterlánc |
| Sűrűség | Mindig sűrű | Sűrű vagy ritka | Mindig ritka |
| Adatbázisban tárolva | Igen | Igen | Nem |
| Inicializálást igényel | Igen | Igen | Nem |
Varrays
A Varray egy olyan gyűjtemény, amelyben a tömb mérete rögzített és nem léphető túl. A Varray alsó indexe egy numerikus érték. A Varray attribútumai a következők:
- A felső határméret rögzített.
- Szekvenciálisan feltöltve, az '1' alsó indexszel kezdve.
- Ez a gyűjteménytípus mindig sűrű; nem törölhetünk egyes tömbelemeket. Egy Varray törölhető egészében, vagy a végéről levágható.
- Mivel mindig sűrű, nagyon kevés a rugalmassága.
- Célszerűbb, ha a tömb mérete ismert, és hasonló műveleteket hajtunk végre minden elemen.
- A gyűjtemény indexe és darabszáma mindig stabil marad.
- Használat előtt inicializálni kell. Az EXISTS művelet kivételével minden művelet hibát dob egy nem inicializált gyűjteményen.
- Létrehozható adatbázis-objektumként, amely az egész adatbázisban látható, vagy egy alprogramon belül, kizárólag ott való használatra.
Az alábbi ábra egy Varray (sűrű) memória-elosztását mutatja be.
| 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 egy VARRAY változóként van deklarálva, melynek típusa 'DATA_TYPE' a megadott 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 nem rögzített. Numerikus alsó index típusú. További információ a beágyazott tábla típusáról:
- A beágyazott táblázatnak nincs felső méretkorlátja.
- Mivel a felső határ nincs rögzítve, a memóriát minden használat előtt bővíteni kell az 'EXTEND' kulcsszó használatával.
- Szekvenciálisan feltöltve, az '1' alsó indexszel kezdve.
- Ez a gyűjteménytípus lehet mindkettő sűrű és ritka; létrehozhatjuk sűrűként, és véletlenszerűen törölhetjük az egyes elemeket, ami ritkává teszi.
- Nagyobb rugalmasságot biztosít a tömbelemek törléséhez.
- Egy rendszer által generált adatbázistáblában tárolódik, és választó lekérdezésekben használható értékek lekérésére.
- Az alsó index és a darabszám változhat.
- Használat előtt inicializálni kell. Az EXISTS művelet kivételével minden művelet hibát dob egy nem inicializált gyűjteményen.
- Létrehozható adatbázis-objektumként, amely az egész adatbázisban látható, vagy egy alprogramon belül, kizárólag ott való használatra.
Az alábbi ábra egy beágyazott tábla (sűrű és ritka) memóriafoglalását mutatja be. Az üres elemterület ritka elemet jelöl.
| 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 <type_name> IS TABLE OF <DATA_TYPE>;
- A fenti szintaxisban a type_name egy beágyazott, 'DATA_TYPE' típusú táblagyűjteményként van deklarálva. Az adattípus lehet egyszerű vagy összetett.
Táblázat szerinti indexelés
Az indexelt tábla olyan gyűjtemény, amelyben a tömb mérete nem rögzített. Más gyűjteménytípusokkal ellentétben az indexelt tábla alsó indexét a felhasználó határozhatja meg. Az indexelt tábla attribútumai a következők:
- Az alsó index lehet egész szám vagy karakterlánc. Az alsó index típusát a gyűjtemény létrehozásakor meg kell említeni.
- 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 adatbázis oszlopban. Egy adott munkameneten belül jönnek létre és kerülnek felhasználásra.
- Nagyobb rugalmasságot biztosítanak az előjegyzés karbantartásában.
- Az alsó indexek lehetnek negatív sorozatok.
- Ezek megfelelőbbek az ugyanazon alprogramon belül használt viszonylag kisebb gyűjteményértékekhez.
- Használat előtt nem kell inicializálni őket.
- Nem hozhatók létre adatbázis-objektumként; csak egy alprogramon belül jönnek létre.
- A BULK COLLECT nem használható ezzel a gyűjteménytípussal, mivel az alsó indexet minden rekordhoz explicit módon meg kell adni.
Az alábbi ábra egy indexelt (ritka) tábla memóriafoglalását mutatja be. Az üres elemterület ritka elemet jelöl.
| alsó index (varchar) | ELSŐ | MÁSODIK | HARMADIK | NEGYEDIK | ÖTÖDIK | HATODIK | HETEDIK |
| Érték (ritka) | Qwe | asd | Afg | asd | Wer |
Index-by-Table szintaxisa:
TYPE <type_name> IS TABLE OF <DATA_TYPE> INDEX BY VARCHAR2 (10);
- A fenti szintaxisban a type_name egy 'DATA_TYPE' típusú indexelt táblagyűjteményként van deklarálva. Az alsó index változó VARCHAR2 típusú, maximális mérete 10.
Konstruktor és inicializálási koncepció a gyűjteményekben
A konstruktorok beépített függvények, amelyeket a Oracle amelyeknek ugyanaz a nevük, mint az objektumnak vagy a gyűjteménynek. Ezek futnak le először, amikor egy objektumra vagy gyűjteményre először hivatkoznak egy munkamenetben. A konstruktor fontos részletei a gyűjtemény kontextusában:
- Gyűjtemények esetén ezeket a konstruktorokat explicit módon kell meghívni a gyűjtemény inicializálásához.
- Mind a Varray, mind a beágyazott táblákat inicializálni kell ezekkel a konstruktorokkal, mielőtt a programban hivatkoznánk rájuk.
- Egy konstruktor implicit módon kiterjeszti egy gyűjtemény memóriafoglalását (a Varray kivételével), így változókat is rendelhet a gyűjteményhez.
- A konstruktorokon keresztüli értékek hozzárendelése soha nem teszi ritkává a gyűjteményt.
Gyűjtési módszerek
Oracle számos függvényt biztosít a gyűjtemények kezeléséhez és kezeléséhez. Ezek a függvények meghatározzák és módosítják a gyűjtemény különböző attribútumait. Az alábbi táblázat a különböző függvényeket és azok leírását tartalmazza.
| Módszer | Leírás | Szintaxis |
|---|---|---|
| LÉTEZIK (n) | Logikai eredményt ad vissza. IGAZ értéket ad vissza, ha az n-edik elem létezik, egyébként HAMIS értéket. Csak EXISTS használható inicializálatlan gyűjteményeken. | .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. Varray esetén a fix méretet adja vissza; beágyazott és indexelt táblák esetén NULL értéket ad vissza. | .HATÁR |
| ELSŐ | Visszaadja a gyűjtemény első alsó indexének értékét. | .ELSŐ |
| LAST | Visszaadja a gyűjtemény utolsó alsó indexének értékét. | .UTOLSÓ |
| ELŐZŐ (n) | Visszaadja az n-edik elem előző alsó indexét. Ha nincs ilyen, akkor NULL értéket ad vissza. | .PRIOR(n) |
| KÖVETKEZŐ (n) | Visszaadja az n-edik elem következő alsó indexét. Ha nincs ilyen, akkor NULL értéket ad vissza. | .KÖVETKEZŐ(n) |
| KITERJESZT | Egy elemet bővít ki a gyűjtemény végén. | .KITERJESZT |
| KITERJESZTÉS (n) | n elemet bővít ki egy gyűjtemény végén. | .EXTEND(n) |
| KITERJESZTÉS (n,i) | Az i-edik elem n példányát bővíti ki 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űjtemény végéről. | .TRIM (n) |
| DELETE | Törli az összes elemet a gyűjteményből, így az üres lesz. | .TÖRÖL |
| TÖRLÉS (n) | Törli az n-edik elemet. Ha az n-edik elem NULL, akkor nem történik semmi. | .DELETE(n) |
| TÖRLÉS (m,n) | Törli az m-edik és n-edik tartomány elemeit a gyűjteményben. | .DELETE(m,n) |
1. példa: Rekordtípus alprogram szinten
Ebben a példában láthatjuk, hogyan tölthetjük fel a gyűjteményt a következő használatával: 'ÖSSZES GYŰJTÉS„és hogyan lehet hivatkozni a gyűjteményadatokra.”
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; /
Code Magyarázat
- Code 2-8. sor: Rekord típusa Az „emp_det” deklarálása a következő oszlopokkal történik: emp_no, emp_name, manager és salary, adattípus: NUMBER, VARCHAR2, NUMBER és NUMBER.
- Code 9. sor: Az „emp_det” rekordtípusú elem „emp_det_tbl” gyűjteményének létrehozása.
- Code 10. sor: A 'guru99_emp_rec' változó deklarálása 'emp_det_tbl' típusként és inicializálása egy null konstruktorral.
- Code 12-15. sor: A mintaadatok beillesztése az 'emp' táblába.
- Code 16. sor: Beillesztési tranzakció véglegesítése.
- Code 17. sor: A rekordok lekérése az 'emp' táblából és a collection változó tömeges feltöltése a „BULK COLLECT” paranccsal. A 'guru99_emp_rec' változó mostantól az 'emp' táblában található összes rekordot tartalmazza.
- Code 19-26. sor: A 'FOR' ciklus beállítása úgy, hogy a gyűjtemény összes rekordját egyenként nyomtassa ki. A FIRST és LAST gyűjtési metódusok alsó és felső határértékként szolgálnak. hurok.
output: Amikor a fenti kódot végrehajtjuk, a következő kimenetet kapjuk.
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 ----------------------------------------------


