Oracle PL / SQL kolekcije: Varijacije, ugniježđene & Kazalo po tablicama

Sadržaj:

Anonim

Što je kolekcija?

Zbirka je uređena skupina elemenata pojedinih tipova podataka. To može biti zbirka jednostavnih vrsta podataka ili složenih vrsta podataka (poput korisnički definiranih ili vrsta zapisa).

U zbirci je svaki element prepoznat pojmom koji se naziva "indeks". Svakoj stavci u zbirci dodijeljen je jedinstveni indeks. Podaci s te zbirke mogu se manipulirati ili dohvatiti pozivanjem na taj jedinstveni indeks.

Zbirke su najkorisnije stvari kada treba obrađivati ​​ili manipulirati velikim podacima istog tipa. Kolekcije se mogu popunjavati i njima se manipulira kao cjelinom pomoću opcije 'BULK' u Oracleu.

U ovom vodiču naučit ćete-

  • Što je kolekcija?
  • Varijable
  • Ugniježđene tablice
  • Indeks po tablici
  • Konstruktor i koncept inicijalizacije u zbirkama
  • Metode prikupljanja

Zbirke su klasificirane na temelju strukture, indeksa i pohrane kako je prikazano u nastavku.

  • Indeks po tablicama (poznat i kao Asocijativni niz)
  • Ugniježđene tablice
  • Varijable

U bilo kojem trenutku, podaci u zbirci mogu se uputiti pomoću tri pojma Naziv zbirke, indeks, naziv polja / stupca kao " (). ". O ovim gore spomenutim kategorijama kolekcija saznat ćete dalje u odjeljku ispod.

Varijable

Varray je metoda prikupljanja u kojoj je veličina niza fiksna. Veličina polja ne može se premašiti od fiksne vrijednosti. Indeks Varray ima numeričku vrijednost. Slijede atributi Varrays.

  • Veličina gornje granice je fiksna
  • Naseljava se sekvencijalno počevši od indeksa '1'
  • Ova je vrsta zbirke uvijek gusta, tj. Ne možemo izbrisati nijedan element niza. Polje se može izbrisati u cjelini ili se može obrezati s kraja.
  • Budući da je uvijek guste prirode, ima vrlo malu fleksibilnost.
  • Prikladnije je koristiti kad je poznata veličina polja i izvoditi slične aktivnosti na svim elementima niza.
  • Indeks i slijed uvijek ostaju stabilni, tj. Indeks i broj zbirke uvijek su isti.
  • Prije upotrebe u programima potrebno ih je inicijalizirati. Svaka operacija (osim operacije POSTOJI) na neinicijaliziranoj zbirci izbacit će pogrešku.
  • Može se stvoriti kao objekt baze podataka, koji je vidljiv u cijeloj bazi podataka ili unutar potprograma, koji se može koristiti samo u tom potprogramu.

Sljedeća slika će shematski objasniti dodjelu Varray-a (guste) memorije.

Pretplata 1 2 3 4 5 6 7
Vrijednost Xyz Dfv Sde Cxs Vbc Nhu Qwe

Sintaksa za VARRAY:

TYPE  IS VARRAY () OF ;
  • U gornjoj sintaksi, ime_tipa deklarirano je kao VARRAY tipa 'DATA_TYPE' za dano ograničenje veličine. Tip podataka može biti jednostavan ili složen tip.

Ugniježđene tablice

Ugnježđena tablica je zbirka u kojoj veličina polja nije fiksna. Ima numerički tip indeksa. Ispod je još opisa o ugniježđenoj vrsti tablice.

  • Ugnježđena tablica nema gornju granicu veličine.
  • Budući da gornja granica veličine nije fiksna, zbirku, memoriju treba svaki put produžiti prije nego što je upotrijebimo. Zbirku možemo proširiti pomoću ključne riječi 'EXTEND'.
  • Naseljava se sekvencijalno počevši od indeksa '1'.
  • Ova vrsta zbirke može biti i gusta i rijetka , tj. Možemo stvoriti kolekciju kao gustu, a možemo i nasumično izbrisati pojedinačni element niza, što ga čini rijetkim.
  • Daje veću fleksibilnost u pogledu brisanja elementa niza.
  • Pohranjena je u tablici baze podataka generiranoj sustavom i može se koristiti u odabranom upitu za dohvaćanje vrijednosti.
  • Indeks i slijed nisu stabilni, tj. Indeks i broj elementa polja mogu se razlikovati.
  • Prije upotrebe u programima potrebno ih je inicijalizirati. Svaka operacija (osim operacije POSTOJI) na neinicijaliziranoj zbirci izbacit će pogrešku.
  • Može se stvoriti kao objekt baze podataka, koji je vidljiv u cijeloj bazi podataka ili unutar potprograma, koji se može koristiti samo u tom potprogramu.

Sljedeća slika će shematski objasniti dodjelu memorije ugniježđene tablice (guste i rijetke). Prostor elemenata u crnoj boji označava prazan element u zbirci, tj. Rijedak.

Pretplata 1 2 3 4 5 6 7
Vrijednost (gusta) Xyz Dfv Sde Cxs Vbc Nhu Qwe
Vrijednost (rijetko) Qwe Asd Afg Asd Wer

Sintaksa za ugniježđenu tablicu:

TYPE  IS TABLE OF ;
  • U gornjoj sintaksi, type_name je deklariran kao ugniježđena zbirka tablice tipa 'DATA_TYPE'. Tip podataka može biti jednostavan ili složen tip.

Indeks po tablici

Index-by-table je zbirka u kojoj veličina polja nije fiksna. Za razliku od ostalih vrsta kolekcije, u zbirci indeksa po tablici indeks može sadržavati korisnik. Slijede atributi indeksa po tablici.

  • Indeks može biti cijelog broja ili niza. U vrijeme stvaranja zbirke treba spomenuti tip indeksa.
  • Te se zbirke ne pohranjuju uzastopno.
  • Uvijek su rijetke prirode.
  • Veličina polja nije fiksna.
  • Ne mogu se pohraniti u stupac baze podataka. Oni će se stvoriti i koristiti u bilo kojem programu u toj određenoj sesiji.
  • Daju veću fleksibilnost u pogledu održavanja indeksa.
  • Indeksi također mogu biti negativnog niza indeksa.
  • Prikladnije ih je koristiti za relativno manje zbirne vrijednosti u kojima se zbirka može inicijalizirati i koristiti u okviru istih potprograma.
  • Ne trebaju biti inicijalizirane prije nego što ih započnete koristiti.
  • Ne može se stvoriti kao objekt baze podataka. Može se stvoriti samo unutar potprograma, koji se može koristiti samo u tom potprogramu.
  • BULK COLLECT se ne može koristiti u ovoj vrsti zbirke jer bi se indeks trebao dati izričito za svaki zapis u zbirci.

Sljedeća slika će shematski objasniti dodjelu memorije ugniježđene tablice (rijetke). Prostor elemenata u crnoj boji označava prazan element u zbirci, tj. Rijedak.

Pretplata (varchar) PRVI DRUGI TREĆI ČETVRTI PETI ŠESTI SEDMI
Vrijednost (rijetko) Qwe Asd Afg Asd Wer

Sintaksa za indeks po tablici

TYPE  IS TABLE OF  INDEX BY VARCHAR2 (10);
  • U gornjoj sintaksi, type_name je deklariran kao zbirka indeksa po tablici tipa 'DATA_TYPE'. Tip podataka može biti jednostavan ili složen tip. Varijabla subsciprt / index daje se kao tip VARCHAR2 s maksimalnom veličinom kao 10.

Konstruktor i koncept inicijalizacije u zbirkama

Konstruktori su ugrađena funkcija koju pruža oracle koja ima isto ime kao objekt ili zbirke. Prvo se izvršavaju kad god se objekt ili kolekcije upućuju prvi put u sesiji. Ispod su važni detalji konstruktora u kontekstu zbirke:

  • Za zbirke bi se ovi konstruktori trebali eksplicitno pozvati da ih inicijaliziraju.
  • I tablice Varray i ugniježđene potrebno je inicijalizirati putem ovih konstruktora prije upućivanja u program.
  • Konstruktor implicitno proširuje dodjelu memorije za kolekciju (osim Varray-a), stoga konstruktor također može dodijeliti varijable kolekcijama.
  • Dodjeljivanje vrijednosti kolekciji putem konstruktora nikada neće učiniti zbirku oskudnom.

Metode prikupljanja

Oracle nudi mnoge funkcije za manipulaciju i rad sa zbirkama. Te su funkcije vrlo korisne u programu za određivanje i modificiranje različitih atributa zbirki. Sljedeća tablica dati će različite funkcije i njihov opis.

Metoda Opis SINTAKSA
POSTOJI (n) Ova metoda vratit će logičke rezultate. Vratit će 'TRUE' ako n- ti element postoji u toj zbirci, u suprotnom će vratiti FALSE. U neinicijaliziranim zbirkama mogu se koristiti samo funkcije POSTOJI .POSTOJI (položaj_elementa)
RAČUNATI Daje ukupan broj elemenata prisutnih u zbirci .COUNT
OGRANIČITI Vraća maksimalnu veličinu zbirke. Za Varray će vratiti fiksnu veličinu koja je definirana. Za ugniježđenu tablicu i indeks po tablici daje NULL .LIMIT
PRVI Vraća vrijednost prve indeksne varijable (indeks) zbirki . PRVI
POSLJEDNJI Vraća vrijednost posljednje indeksne varijable (indeks) zbirki .LAST
PRIJE (n) Vraća prethodi indeksnoj varijabli u zbirci n- tog elementa. Ako nema prethodne vrijednosti indeksa, vraća se NULL .PRIOR (n)
DALJE (n) Vraća uspješnu indeksnu varijablu u zbirci n- tog elementa. Ako nema uspjeha, vraća se vrijednost indeksa NULL .NAPRIJED (n)
PRODUŽI Na kraju proširuje jedan element u zbirci .EXTEND
PRODUŽI (n) Proširuje n elemenata na kraju zbirke .EXTEND (n)
PRODUŽI (n, i) Proširuje n kopija i. Elementa na kraju zbirke .EXTEND (n, i)
TRIM Uklanja jedan element s kraja zbirke .TRIM
TRIM (n) Uklanja n elemenata s kraja zbirke .TRIM (n)
IZBRISATI Briše sve elemente iz zbirke. Čini zbirku praznom .DELETE
IZBRIŠI (n) Briše n-ti element iz zbirke. Ako je n- ti element NULL, to neće učiniti ništa .DELETE (n)
IZBRIŠI (m, n) Briše element u rasponu od m- tog do n- tog u zbirci .DELETE (m, n)

Primjer1: Vrsta zapisa na razini potprograma

U ovom ćemo primjeru vidjeti kako popuniti zbirku pomoću 'BULK COLLECT' i kako uputiti podatke o zbirci.

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

Objašnjenje koda:

  • Redak koda 2-8 : Vrsta zapisa 'emp_det' deklarira se sa stupcima emp_no, emp_name, plaća i upravitelj podataka tipa BROJ, VARCHAR2, BROJ, BROJ.
  • Redak koda 9: Stvaranje zbirke 'emp_det_tbl' elementa tipa zapisa 'emp_det'
  • Redak koda 10: Deklariranje varijable 'guru99_emp_rec' kao tipa 'emp_det_tbl' i inicijalizacija null konstruktorom.
  • Redak koda 12-15: Umetanje uzoraka podataka u tablicu 'emp'.
  • Redak koda 16: Predavanje umetanja transakcije.
  • Redak koda 17: Dohvaćanje zapisa iz tablice 'emp' i skupno popunjavanje varijable zbirke pomoću naredbe "BULK COLLECT". Sada varijabla 'guru99_emp_rec' sadrži sve zapise koji su prisutni u tablici 'emp'.
  • Redak koda 19-26: Postavljanje petlje 'FOR' pomoću pojedinačnog ispisa svih zapisa u zbirci. Metoda prikupljanja PRVI i POSLJEDNJI koristi se kao donja i viša granica petlje.

Izlaz : Kao što možete vidjeti na gornjoj snimci zaslona, ​​kada se izvrši gornji kod, dobit ćete sljedeći izlaz

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