Oracle PL/SQL BULK COLLECT: FORALL Primjer

โšก Pametni saลพetak

VELIKO PRIKUPLJANJE u Oracle PL/SQL dohvaฤ‡a viลกe redaka odjednom u kolekciju, dok FORALL vraฤ‡a skupni DML natrag u bazu podataka. Oba cut contexta prebacuju se izmeฤ‘u SQL i PL/SQL mehanizama, poveฤ‡avajuฤ‡i performanse.

  • ???? VELIKO PRIKUPLJANJE: Dohvaฤ‡a viลกe redaka u jednom prolazu u varijablu kolekcije, zamjenjujuฤ‡i sporo dohvaฤ‡anje redak po redak.
  • ๐Ÿ” ZA SVE: Izvodi jedan INSERT, UPDATE ili DELETE u cijeloj kolekciji s jednom promjenom konteksta.
  • ๐Ÿ“ Klauzula LIMIT: Ograniฤava broj redaka koje svako skupno prikupljanje uฤitava, ลกtiteฤ‡i memoriju sesije na velikim tablicama.
  • ๐Ÿ“Š Atributi SKUPNOG PRIKUPLJANJA: Atribut %BULK_ROWCOUNT(n) izvjeลกtava na koliko je redaka utjecala n-ta FORALL DML naredba.
  • ๏ธ Potrebne kolekcije: Klauzula INTO mora ciljati tip kolekcije, kao ลกto je ugnijeลพฤ‘ena tablica ili asocijativni niz.
  • ๐Ÿค– AI pomoฤ‡: AI asistenti poput GitHub Copilota izraฤ‘uju BULK COLLECT i FORALL blokove te oznaฤavaju nedostajuฤ‡u LIMIT klauzulu.

Oracle Pregled PL/SQL BULK COLLECT i FORALL s LIMIT klauzulom

ล to je BULK COLLECT?

SKUPNO PRIKUPLJANJE smanjuje promjene konteksta izmeฤ‘u SQL i PL/SQL mehanizam te omoguฤ‡uje SQL mehanizmu da odjednom dohvati zapise.

Oracle PL / SQL pruลพa funkcionalnost skupnog dohvaฤ‡anja zapisa umjesto pojedinaฤnog dohvaฤ‡anja. Ova naredba BULK COLLECT moลพe se koristiti u naredbi SELECT za skupno popunjavanje zapisa ili za dohvaฤ‡anje pokazivaฤ skupno. Buduฤ‡i da BULK COLLECT dohvaฤ‡a zapise skupno, klauzula INTO uvijek treba sadrลพavati varijablu tipa kolekcije. Glavna prednost koriลกtenja BULK COLLECT je poveฤ‡anje performansi smanjenjem interakcije izmeฤ‘u baze podataka i PL/SQL mehanizma.

Sintaksa:

SELECT <column1> BULK COLLECT INTO bulk_variable FROM <table name>;
FETCH <cursor_name> BULK COLLECT INTO <bulk_variable>;

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

FORALL klauzula

Naredba FORALL izvrลกava DML operacije na podacima u skupu. Podsjeฤ‡a na naredbu FOR petlje, osim ลกto se u FOR petlji radnje dogaฤ‘aju na razini zapisa, dok u FORALL-u nema koncepta LOOP-a. Umjesto toga, svi podaci prisutni u zadanom rasponu obraฤ‘uju se istovremeno.

Sintaksa:

FORALL <loop_variable> in <lower range> .. <higher range>

<DML operations>;

U gornjoj sintaksi, zadana DML operacija ฤ‡e se izvrลกiti za sve podatke koji se nalaze izmeฤ‘u donjeg i gornjeg raspona.

LIMIT klauzula

Koncept skupnog prikupljanja uฤitava sve podatke u ciljnu varijablu kolekcije kao skupno, tj. svi podaci ฤ‡e se popuniti u varijablu kolekcije odjednom. Ali to se ne preporuฤuje kada je ukupan broj zapisa koje treba uฤitati vrlo velik, jer kada PL/SQL pokuลกa uฤitati sve podatke, troลกi viลกe memorije sesije. Stoga je uvijek dobro ograniฤiti veliฤinu ove operacije skupnog prikupljanja.

Ovo ograniฤenje veliฤine moลพe se lako postiฤ‡i uvoฤ‘enjem uvjeta ROWNUM u SELECT naredbu, dok u sluฤaju kursora to nije moguฤ‡e.

Da bi se ovo prevladalo, Oracle je osigurao klauzulu LIMIT koja definira broj zapisa koji trebaju biti ukljuฤeni u skupnu datoteku.

Sintaksa:

FETCH <cursor_name> BULK COLLECT INTO <bulk_variable> LIMIT <size>;

U gornjoj sintaksi, naredba za dohvaฤ‡anje 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 na koje utjeฤe n-ta DML naredba FORALL naredbe, tj. daje broj zapisa na koje utjeฤe FORALL naredba za svaku pojedinaฤnu vrijednost iz varijable kolekcije. Izraz 'n' oznaฤava redoslijed vrijednosti u kolekciji za koji je potreban broj redaka.

Primjer 1: U ovom primjeru, projicirat ฤ‡emo sva imena zaposlenika iz emp tablice koristeฤ‡i BULK COLLECT, a takoฤ‘er ฤ‡emo poveฤ‡ati plaฤ‡u svih zaposlenika za 5000 koristeฤ‡i FORALL.

Snimka zaslona u nastavku prikazuje ovaj primjer BULK COLLECT i FORALL zajedno s njegovim izlazom u Oracle.

Primjer skupnog prikupljanja s LIMIT i FORALL aลพuriranjem plaฤ‡e zaposlenika u Oracle PL / SQL

DECLARE
CURSOR 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;
BEGIN
OPEN 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.LAST
LOOP
Dbms_output.put_line('Employee Fetched:'||c_emp_name);
END LOOP;
FORALL i IN lv_emp_name.FIRST .. lv_emp_name.LAST
UPDATE emp SET salary=salary+5000 WHERE emp_name=lv_emp_name(i);
COMMIT;
Dbms_output.put_line('Salary Updated');
CLOSE guru99_det;
END;
/

Izlaz

Employee Fetched:BBB
Employee Fetched:XXX
Employee Fetched:YYY
Salary Updated

Code Objaลกnjenje:

  • Code redak 2: Deklarisanje kursora guru99_det za naredbu 'SELECT emp_name FROM emp'.
  • Code redak 3: Deklarisanje lv_emp_name_tbl kao tipa tablice VARCHAR2(50).
  • Code redak 4: Deklariranje lv_emp_name kao tipa lv_emp_name_tbl.
  • Code redak 6: Otvaranje kursora.
  • Code redak 7: Dohvaฤ‡anje kursora pomoฤ‡u BULK COLLECT naredbe s LIMIT veliฤinom od 5000 u varijablu lv_emp_name.
  • Code redak 8-11: Postavljanje FOR petlje za ispis svih zapisa u kolekciji lv_emp_name.
  • Code redak 12: Koriลกtenje FORALL-a za aลพuriranje plaฤ‡a svih zaposlenika za 5000.
  • Code redak 14: Poฤinjanje transakcija.

Pitanja i odgovori

Ne. BULK COLLECT SELECT nikada ne vraฤ‡a NO_DATA_FOUND; umjesto toga vraฤ‡a praznu kolekciju. Uvijek testirajte kolekciju metodom .COUNT prije loo.ping, inaฤe moลพete tiho obraditi nula redaka.

SAVE EXCEPTIONS omoguฤ‡uje nastavak izvrลกavanja FORALL-a kada pojedinaฤni retci ne uspiju. Neuspjeli retci pohranjuju se u SQL%BULK_EXCEPTIONS, a zatim Oracle podiลพe ORA-24381, koji hvatate u izuzetak rukovatelj za provjeru svake pogreลกke.

Koristite BULK COLLECT kad god petlja ฤita mnogo redaka. pokazivaฤ FOR petlja dohvaฤ‡a jedan redak po prekidaฤu, tako da se skupno dohvaฤ‡anje plus FORALL moลพe izvoditi mnogo puta brลพe na velikim skupovima rezultata.

BULK COLLECT vraฤ‡a viลกe redaka odjednom, pa je potreban spremnik s viลกe redaka. Cilj INTO mora biti zbirka kao ลกto je ugnijeลพฤ‘ena tablica, VARRAY ili asocijativni niz, a ne jedna skalarna varijabla.

Ne. FORALL zaglavlje pokreฤ‡e toฤno jedan INSERT, UPDATE, DELETE ili MERGE. Samo vrijednosti u njegovim VALUES i WHERE klauzulama mogu se mijenjati po iteraciji. Za nekoliko naredbi koristite odvojene FORALL naredbe.

Skupna obrada moลพe biti nekoliko puta, pa ฤak i preko stotinu puta, brลพa od obrade koda redak po redak, jer BULK COLLECT i FORALL saลพimaju tisuฤ‡e prekidaฤa konteksta motora u nekoliko njih, ลกto znaฤajno smanjuje optereฤ‡enje pri velikim koliฤinama podataka.

Da. GitHub kopilot izraฤ‘uje BULK COLLECT dohvaฤ‡anja, FORALL DML petlje i LIMIT klauzule iz komentara te predlaลพe deklaracije tipova kolekcija, iako biste trebali sami pregledati veliฤine serija i rukovanje greลกkama.

AI asistenti skeniraju petlje koje dohvaฤ‡aju ili mijenjaju jedan redak odjednom i preporuฤuju njihovo prepisivanje pomoฤ‡u BULK COLLECT, LIMIT i FORALL. Ovaj pregled strojnog uฤenja otkriva nedostajuฤ‡a LIMIT ograniฤenja i uska grla u performansama prije produkcije.

Saลพmite ovu objavu uz: