Oracle PL / SQL BULK COLLECT: FORALL Primjer

Sadržaj:

Anonim

Što je BULK COLLECT?

BULK COLLECT smanjuje prebacivanje konteksta između SQL i PL / SQL mehanizma i omogućuje SQL mehanizmu da odjednom dohvaća zapise.

Oracle PL / SQL pruža funkciju skupnog dohvaćanja zapisa, a ne pojedinačnog. Ovaj BULK COLLECT može se koristiti u naredbi 'SELECT' za popunjavanje zapisa skupno ili za skupno preuzimanje kursora. Budući da BULK COLLECT zapis dohvaća u BULK, klauzula INTO uvijek treba sadržavati varijablu vrste zbirke. Glavna prednost korištenja BULK COLLECT-a je povećanje performansi smanjenjem interakcije između baze podataka i PL / SQL mehanizma.

Sintaksa:

SELECT  BULK COLLECT INTO bulk_varaible FROM 
;FETCH  BULK COLLECT INTO ;

U gornjoj sintaksi, BULK COLLECT koristi se za prikupljanje podataka iz izraza 'SELECT' i 'FETCH'.

U ovom vodiču naučit ćete-

  • Klauzula FORALL
  • Klauzula LIMIT
  • BULK COLLECT Atributi

Klauzula FORALL

FORALL omogućuje skupno izvršavanje DML operacija na podacima. Slična je onoj u naredbi petlje FOR, osim u petlji FOR stvari se događaju na razini zapisa, dok u FORALLU nema koncepta LOOP. Umjesto toga, istodobno se obrađuju svi podaci prisutni u danom rasponu.

Sintaksa:

FORALL in;

U gornjoj sintaksi, zadana DML operacija izvršit će se za sve podatke koji su prisutni između nižeg i višeg raspona.

Klauzula LIMIT

Koncept skupnog prikupljanja učitava cijele podatke u ciljanu varijablu prikupljanja kao skupno, tj. Cjelokupni će podaci biti popunjeni u varijablu prikupljanja jednim potezom. Ali to nije uputno kada je ukupan zapis koji treba učitati vrlo velik, jer kada PL / SQL pokušava učitati cjelokupne podatke, troši više memorije sesije. Stoga je uvijek dobro ograničiti veličinu ove operacije skupljanja rasutih tereta.

Međutim, ovo ograničenje veličine može se lako postići uvođenjem uvjeta ROWNUM u izraz 'SELECT', dok u slučaju kursora to nije moguće.

Da bi prevladao ovo, Oracle je osigurao klauzulu 'LIMIT' koja definira broj zapisa koji trebaju biti uključeni u skupinu.

Sintaksa:

FETCH  BULK COLLECT INTO  LIMIT ;

U gornjoj sintaksi, naredba preuzimanja kursora koristi naredbu BULK COLLECT zajedno s klauzulom LIMIT.

BULK COLLECT Atributi

Slično atributima kursora BULK COLLECT ima% BULK_ROWCOUNT (n) koji vraća broj redaka pogođenih u n- tom DML izrazu izraza FORALL, tj. Dat će broj zapisa koji su pogođeni u FORALL izrazu za svaku pojedinu vrijednost iz zbirke varijabilna. Izraz 'n' označava slijed vrijednosti u zbirci, za koji je potreban broj redaka.

Primjer 1 : U ovom ćemo primjeru projicirati cijelo ime zaposlenika iz emp tablice pomoću BULK COLLECT, a također ćemo povećati plaću svih zaposlenika za 5000 koristeći FORALL.

DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;TYPE lv_emp_name_tbl IS TABLE OF VARCHAR2(50);lv_emp_name lv_emp_name_tbl;BEGINOPEN guru99_det;FETCH guru99_det BULK COLLECT INTO lv_emp_name LIMIT 5000;FOR c_emp_name IN lv_emp_name.FIRST… lv_emp_name.LASTLOOPDbms_output.put_line(‘Employee Fetched:‘||c_emp_name);END LOOP:FORALL i IN lv_emp_name.FIRST… lv emp_name.LASTUPDATE emp SET salaiy=salary+5000 WHERE emp_name=lv_emp_name(i);COMMIT; Dbms_output.put_line(‘Salary Updated‘);CLOSE guru99_det;END;/

Izlaz

Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYSalary Updated

Objašnjenje koda:

  • Redak koda 2 : Deklariranje kursora guru99_det za izraz "SELECT emp_name FROM emp".
  • Redak koda 3 : Deklariranje lv_emp_name_tbl kao vrste tablice VARCHAR2 (50)
  • Redak koda 4 : Deklarisanje naziva lv_emp_name kao tipa lv_emp_name_tbl.
  • Redak 6: Otvaranje kursora.
  • Redak koda 7: Dohvaćanje kursora pomoću BULK COLLECT s ograničenom veličinom kao 5000 intl lv_emp_name varijabla.
  • Redak koda 8-11: Postavljanje petlje FOR za ispis cijelog zapisa u zbirci lv_emp_name.
  • Redak koda 12: Korištenje FORALL-a ažurirajući plaću svih zaposlenika za 5000.
  • Redak koda 14: Predaja transakcije.