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.

  • 🧺 Meghatározás: Egy gyűjtemény számos, egy típusba tartozó elemet tartalmaz, amelyek mindegyikét egyedi index azonosítja.
  • 📐 Varray: Fix felső méret, mindig sűrű, numerikus alsó index, használat előtt inicializálni kell.
  • ???? Beágyazott tábla: Nincs méretkorlát, lehet sűrű vagy ritka, rendszertáblában tárolódik, EXTEND függvénnyel bővíthető.
  • 🔑 Táblázat szerinti indexelés: Nincs méretkorlát, az alsó index lehet karakterlánc vagy negatív egész szám, nem tárolódik az adatbázisban.
  • 🏗️ Építész: A Varray és a beágyazott táblák esetében explicit konstruktorra van szükség a hivatkozás előtti inicializáláshoz.
  • 🇧🇷 Módszerek: A COUNT, EXISTS, FIRST, LAST, EXTEND, TRIM és DELETE parancsok egy gyűjteményt kezelnek.
  • bulk: A BULK COLLECT egy lépésben feltölti a gyűjteményt a gyors feldolgozás érdekében.

Oracle PL/SQL gyűjtemények

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

PL/SQL gyűjtemény feltöltve BULK COLLECT példával

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

GYIK

Egy Varray táblának fix felső mérete van, és mindig sűrű. Egy beágyazott táblának nincs méretkorlátja, lehet ritka, és bővíthető, ami rugalmasabbá teszi a növekvő vagy hiányos adatok kezelését.

Mivel ez egy memórián belüli asszociatív tömb, nem pedig egy tárolt tábla, az alsó index keresőkulcsként működik, tehát egy karakterlánc vagy negatív egész szám is működik, ami hasznos a kulcsolt keresésekhez egy munkameneten belül.

Egy inicializálatlan Varray vagy beágyazott tábla atomilag null, így egy elemre való hivatkozás hibát okoz. A konstruktor meghívása lefoglalja azt, ami után az EXTEND és az értékadások hozzáadhatnak adatokat.

Igen. Tekintettel arra, hogy a méret rögzített, hogy az adatok tárolva vannak-e, és hogy szükség van-e karakterlánckulcsra, a mesterséges intelligencia egy Varray, beágyazott táblára vagy indexelt táblára mutathat, és elmagyarázhatja a kompromisszumot.

A BULK COLLECT egyetlen kontextusváltással tölti be az összes sort egy gyűjteménybe az SQL és a PL/SQL motorok között, a soronkénti egy váltás helyett, ami jelentősen csökkenti a nagy eredményhalmazok terhelését.

Foglald össze ezt a bejegyzést a következőképpen: