„Oracle PL / SQL“ kolekcijos: varpos, įdėtos & Indeksas pagal lenteles

Turinys:

Anonim

Kas yra kolekcija?

Kolekcija yra sutvarkyta tam tikrų duomenų tipų elementų grupė. Tai gali būti paprasto duomenų tipo arba sudėtingo duomenų tipo rinkinys (pvz., Vartotojo apibrėžti ar įrašų tipai).

Kolekcijoje kiekvienas elementas identifikuojamas terminu, vadinamu „subscript“. Kiekvienam kolekcijos elementui priskiriamas unikalus indeksas. Toje kolekcijoje esančiais duomenimis galima manipuliuoti arba juos gauti, nurodant tą unikalų indeksą.

Kolekcijos yra naudingiausi dalykai, kai reikia apdoroti ar tvarkyti didelius to paties tipo duomenis. Kolekcijas galima užpildyti ir jomis naudotis kaip vientisomis, naudojant „Oracle“ parinktį „BULK“.

Šioje pamokoje sužinosite

  • Kas yra kolekcija?
  • Varrays
  • Lizdinės lentelės
  • Po indeksą
  • Konstruktoriaus ir inicializavimo koncepcija kolekcijose
  • Surinkimo metodai

Kolekcijos klasifikuojamos pagal struktūrą, indeksą ir saugyklą, kaip parodyta žemiau.

  • Po indeksus (taip pat žinomas kaip asociatyvusis masyvas)
  • Lizdinės lentelės
  • Varrays

Bet kuriuo metu kolekcijos duomenys gali būti vadinami trimis terminais Kolekcijos pavadinimas, Subkriptas, Lauko / Stulpelio pavadinimas kaip " (). ". Apie šias aukščiau paminėtas kolekcijos kategorijas sužinosite toliau esančiame skyriuje.

Varrays

„Varray“ yra rinkimo metodas, kai fiksuojamas masyvo dydis. Masyvo dydis negali būti didesnis nei jo fiksuota vertė. „Varray“ indeksas yra skaitinės vertės. Toliau pateikiami „Varrays“ atributai.

  • Viršutinės ribos dydis yra fiksuotas
  • Gyvenama nuosekliai pradedant indeksu „1“
  • Šis rinkinio tipas visada yra tankus, ty negalime ištrinti jokių masyvo elementų. „Varray“ galima ištrinti kaip visumą arba apipjaustyti nuo galo.
  • Kadangi jis visada yra tankus, jis turi labai mažai lankstumo.
  • Tikslingiau naudoti, kai žinomas masyvo dydis, ir atlikti panašius veiksmus su visais masyvo elementais.
  • Indeksas ir seka visada išlieka stabilūs, ty rinkinio indeksas ir skaičius visada yra vienodi.
  • Jie turi būti inicializuoti prieš naudojant juos programose. Bet kokia neinicijuoto rinkinio operacija (išskyrus „EKSISTUOJAMOS operacijos“) sukels klaidą.
  • Jis gali būti sukurtas kaip duomenų bazės objektas, matomas visoje duomenų bazėje arba paprogramės viduje, kuris gali būti naudojamas tik toje paprogramėje.

Žemiau pateiktas paveikslėlis paaiškins Varray (tankus) atminties paskirstymą schematiškai.

Abonementas 1 2 3 4 5 6 7
Vertė Xyz Dfv Sde Cxs Vbc Nhu Qwe

VARRAY sintaksė:

TYPE  IS VARRAY () OF ;
  • Pirmiau pateiktoje sintaksėje tipo_pavadinimas nurodomas kaip „DATA_TYPE“ tipo VARRAY nurodytam dydžio apribojimui. Duomenų tipas gali būti paprastas arba sudėtingas.

Lizdinės lentelės

Įdėta lentelė yra rinkinys, kuriame masyvo dydis nėra nustatytas. Jis turi skaitmeninį indekso tipą. Žemiau yra daugiau aprašų apie įdėtą lentelės tipą.

  • „Nested“ lentelėje nėra viršutinio dydžio apribojimo.
  • Kadangi viršutinė dydžio riba nėra nustatyta, rinkinį, atmintį reikia kiekvieną kartą išplėsti, kol mes ją naudosime. Kolekciją galime išplėsti naudodami „EXTEND“ raktinį žodį.
  • Gyvenama nuosekliai pradedant indeksu „1“.
  • Šis rinkinio tipas gali būti ir tankus, ir retas , ty mes galime sukurti kolekciją kaip tankią, taip pat galime atsitiktinai ištrinti atskirą masyvo elementą, todėl jis tampa toks retas.
  • Tai suteikia daugiau lankstumo ištrinant masyvo elementą.
  • Jis saugomas sistemos sugeneruotoje duomenų bazės lentelėje ir gali būti naudojamas pasirinktoje užklausoje norint gauti reikšmes.
  • Indeksas ir seka nėra stabilūs, ty indeksas ir masyvo elemento skaičius gali skirtis.
  • Jie turi būti inicializuoti prieš naudojant juos programose. Bet kokia neinicijuoto rinkinio operacija (išskyrus „EKSISTUOJAMOS operacijos“) sukels klaidą.
  • Jis gali būti sukurtas kaip duomenų bazės objektas, matomas visoje duomenų bazėje arba paprogramės viduje, kuris gali būti naudojamas tik toje paprogramėje.

Žemiau pateiktas paveikslėlis paaiškins įdėtos lentelės (tankios ir retos) atminties paskirstymą schematiškai. Juodos spalvos elemento tarpas žymi tuščią kolekcijos elementą, ty retą.

Abonementas 1 2 3 4 5 6 7
Vertė (tanki) Xyz Dfv Sde Cxs Vbc Nhu Qwe
Vertė (negausi) Qwe Asd Afg Asd Wer

Įterptosios lentelės sintaksė:

TYPE  IS TABLE OF ;
  • Pirmiau pateiktoje sintaksėje type_name deklaruojamas kaip „DATA_TYPE“ tipo įdėtųjų lentelių rinkinys. Duomenų tipas gali būti paprastas arba sudėtingas.

Po indeksą

Rodyklė po lentelės yra rinkinys, kuriame masyvo dydis nėra fiksuotas. Skirtingai nuo kitų rinkinių tipų, indeksų lentelių rinkinyje indeksą gali apibrėžti vartotojas. Toliau pateikiami kiekvieno indekso atributai.

  • Indekso gali būti sveikas skaičius arba eilutės. Kuriant kolekciją, reikia paminėti prenumeratos tipą.
  • Šios kolekcijos nėra saugomos nuosekliai.
  • Jie visada yra reto pobūdžio.
  • Masyvo dydis nėra fiksuotas.
  • Jų negalima saugoti duomenų bazės stulpelyje. Jie turi būti sukurti ir naudojami bet kurioje konkrečios sesijos programoje.
  • Jie suteikia daugiau lankstumo išlaikant indeksą.
  • Abonementai taip pat gali būti neigiami.
  • Jas tikslingiau naudoti palyginti mažesnėms kolektyvinėms vertėms, kuriose kolekciją galima inicijuoti ir naudoti tose pačiose paprogramėse.
  • Prieš pradedant juos naudoti, jų nereikia inicializuoti.
  • Jo negalima sukurti kaip duomenų bazės objekto. Jį galima sukurti tik paprogramės viduje, kuri gali būti naudojama tik toje paprogramėje.
  • „BULK COLLECT“ negalima naudoti šio tipo kolekcijose, nes kiekvienam rinkinio įrašui turėtų būti aiškiai nurodytas indeksas.

Žemiau pateiktas paveikslėlis paaiškins „Nested Table“ (negausios) atminties paskirstymą schematiškai. Juodos spalvos elemento tarpas žymi tuščią kolekcijos elementą, ty retą.

Prenumerata (varchar) PIRMAS ANTRA TREČIAS KETVIRTA PENKTAS ŠEŠTAS SEPTINTASIS
Vertė (negausi) Qwe Asd Afg Asd Wer

Po indekso sintaksė

TYPE  IS TABLE OF  INDEX BY VARCHAR2 (10);
  • Pirmiau pateiktoje sintaksėje type_name yra deklaruojamas kaip „DATA_TYPE“ tipo indeksų rinkinys. Duomenų tipas gali būti paprastas arba sudėtingas. Subciprt / index kintamasis pateikiamas kaip VARCHAR2 tipas, o didžiausias dydis yra 10.

Konstruktoriaus ir inicializavimo koncepcija kolekcijose

Konstruktoriai yra integruota funkcija, kurią teikia orakulas, kuris turi tą patį pavadinimą kaip objektas ar kolekcijos. Jie vykdomi pirmiausia, kai objektas ar kolekcijos pirmą kartą persiunčiamos sesijos metu. Toliau pateikiamos svarbios konstruktoriaus detalės kolekcijos kontekste:

  • Kolekcijoms reikia inicializuoti šiuos konstruktorius.
  • Tiek „Varray“, tiek „Nested“ lenteles reikia inicijuoti per šiuos konstruktorius, prieš pradedant jas nukreipti į programą.
  • Konstruktorius netiesiogiai išplečia atminties paskirstymą kolekcijai (išskyrus Varray), taigi konstruktorius taip pat gali priskirti kintamuosius kolekcijoms.
  • Priskyrę kolekcijai vertybes per konstruktorius, kolekcija niekada nebus reta.

Surinkimo metodai

„Oracle“ teikia daug funkcijų, leidžiančių manipuliuoti ir dirbti su kolekcijomis. Šios funkcijos yra labai naudingos programoje nustatant ir modifikuojant skirtingą kolekcijų atributą. Šioje lentelėje pateikiamos skirtingos funkcijos ir jų aprašymas.

Metodas apibūdinimas Sintaksė
ESA (n) Šis metodas pateiks loginius rezultatus. Jis grąžins „TRUE“, jei toje kolekcijoje yra n -tasis elementas, kitaip jis pateiks FALSE. Neinicijuotame rinkinyje galima naudoti tik EXISTS funkcijas .EXISTS (elemento_pozicija)
COUNT Nurodo bendrą kolekcijoje esančių elementų skaičių .COUNT
LIMIT Tai grąžina maksimalų kolekcijos dydį. „Varray“ jis grąžins nustatytą dydį. Įdėtoms lentelėms ir indeksams pagal lenteles ji suteikia NULL .LIMIT
PIRMAS Grąžina pirmojo rinkinių indekso kintamojo (indekso) vertę . PIRMAS
PASKUTINIS Grąžina paskutinio rinkinių indekso kintamojo (indekso) vertę . PASKUTINĖ
PRIEŠ (n) Grąžina prieš indekso kintamąjį n -ojo elemento rinkinyje . Jei nėra ankstesnės indekso vertės, grąžinama NULL . PRIEŠ (n)
TOLESNIS (n) Grąžina indekso kintamąjį n -ojo elemento rinkinyje . Jei nėra sėkmingo indekso vertės, grąžinama NULL .KITAS (n)
IŠPLĖSTI Pabaigia vieną kolekcijos elementą pabaigoje .EXTEND
IŠPLĖTTI (n) Išplečia n elementus kolekcijos pabaigoje .EXTEND (n)
IŠPLĖTTI (n, i) Išplečia n i -ojo elemento egzempliorių kolekcijos pabaigoje .EXTEND (n, i)
APKARPYTI Pašalina vieną elementą iš kolekcijos pabaigos . TRIM
TRIM (n) Pašalina n elementus iš kolekcijos pabaigos . TRIM (n)
IŠTRINTI Ištrina visus elementus iš kolekcijos. Padaro kolekciją tuščią . IŠTRINKITE
IŠTRINTI (n) Ištrinamas n-tasis elementas iš kolekcijos. Jei n -tasis elementas yra NULL, tai nieko nepadarys . IŠTRINKITE (n)
IŠTRINTI (m, n) Ištrina diapazonas m elementas d -n -oji surinkimo . DELETE (m, n)

1 pavyzdys: Įrašo tipas paprogramės lygiu

Šiame pavyzdyje mes pamatysime, kaip užpildyti kolekciją naudojant „BULK COLLECT“ ir kaip nurodyti kolekcijos duomenis.

DECLARETYPE 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();BEGININSERT 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_recFROM emp;dbms_output.put_line (‘Employee Detail');FOR i IN guru99_emp_rec.FIRST… guru99_emp_rec.LASTLOOPdbms_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;/

Kodo paaiškinimas:

  • 2–8 kodo eilutė : įrašo tipas „emp_det“ deklaruojamas su stulpeliais emp_no, emp_name, alga ir duomenų tipo NUMBER, VARCHAR2, NUMBER, NUMBER valdytoju.
  • 9 kodo eilutė: įrašo tipo elemento „emp_det“ kolekcijos „emp_det_tbl“ kūrimas
  • 10 kodo eilutė: kintamojo „guru99_emp_rec“ paskelbimas tipu „emp_det_tbl“ ir inicijavimas naudojant nulinį konstruktorių.
  • Kodo eilutė 12-15: Duomenų pavyzdžiai įterpiami į lentelę „emp“.
  • Kodo 16 eilutė: įvykdyti įterpimo operaciją.
  • 17 kodo eilutė: Įrašų gavimas iš „emp“ lentelės ir rinkinio kintamojo užpildymas kaip masinis, naudojant komandą „BULK COLLECT“. Dabar kintamajame „guru99_emp_rec“ yra visi įrašai, esantys lentelėje „emp“.
  • Kodo eilutė 19–26: „FOR“ kilpos nustatymas naudojant visus po vieną esančius rinkinio įrašus. Surinkimo metodas FIRST ir LAST naudojamas kaip apatinė ir aukščiausia kontūro riba.

Išvestis : Kaip matote aukščiau pateiktoje ekrano kopijoje, kai vykdomas aukščiau pateiktas kodas, gausite šią išvestį

Employee DetailEmployee Number: 1000Employee Name: AAAEmployee Salary: 25000Employee Manager Number: 1000----------------------------------------------Employee Number: 1001Employee Name: XXXEmployee Salary: 10000Employee Manager Number: 1000----------------------------------------------Employee Number: 1002Employee Name: YYYEmployee Salary: 15000Employee Manager Number: 1000----------------------------------------------Employee Number: 1003Employee Name: ZZZEmployee Salary: 7500Employee Manager Number: 1000----------------------------------------------