Oracle PL / SQL BULK COLLECT: FORALL piemērs

Satura rādītājs:

Anonim

Kas ir BULK COLLECT?

BULK COLLECT samazina konteksta pārslēgšanos starp SQL un PL / SQL motoru un ļauj SQL motoram uzreiz ienest ierakstus.

Oracle PL / SQL nodrošina funkcionalitāti ierakstu ielādēšanai lielapjomā, nevis pa vienam. Šo BULK COLLECT var izmantot “SELECT” priekšrakstā, lai ierakstus aizpildītu lielapjomā vai kursoru ienesot lielapjomā. Tā kā BULK COLLECT ierakstu ienes BULK, klauzulā INTO vienmēr jābūt kolekcijas tipa mainīgajam. Galvenā BULK COLLECT izmantošanas priekšrocība ir tā, ka tā palielina veiktspēju, samazinot mijiedarbību starp datu bāzi un PL / SQL dzinēju.

Sintakse:

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

Iepriekš minētajā sintaksē BULK COLLECT tiek izmantots, lai savāktu datus no “SELECT” un “FETCH” priekšraksta.

Šajā apmācībā jūs uzzināsiet-

  • FORALL klauzula
  • LIMIT klauzula
  • BULK COLLECT atribūti

FORALL klauzula

FORALL ļauj veikt DML operācijas ar datiem vairumā. Tas ir līdzīgs FOR cilpas paziņojumam, izņemot to, ka FOR ciklā lietas notiek ierakstu līmenī, turpretī FORALL nav LOOP koncepcijas. Tā vietā tiek apstrādāti visi dati, kas atrodas attiecīgajā diapazonā.

Sintakse:

FORALL in;

Iepriekš minētajā sintaksē dotā DML darbība tiks izpildīta visiem datiem, kas atrodas starp zemāko un augstāko diapazonu.

LIMIT klauzula

Lielapjoma savākšanas koncepcija visus datus ielādē mērķa kolekcijas mainīgajā lielapjomā, ti, visi dati tiks aizpildīti kolekcijas mainīgajā vienā reizē. Bet tas nav ieteicams, ja kopējais ielādējamais ieraksts ir ļoti liels, jo, kad PL / SQL mēģina ielādēt visus datus, tas patērē vairāk sesijas atmiņas. Tādējādi vienmēr ir labi ierobežot šīs lielapjoma savākšanas operācijas lielumu.

Tomēr šo lieluma ierobežojumu var viegli sasniegt, ievadot nosacījumu ROWNUM paziņojumā 'SELECT', turpretī kursora gadījumā tas nav iespējams.

Lai pārvarētu šo Oracle, ir nodrošināta klauzula “LIMIT”, kas nosaka ierakstu skaitu, kas jāiekļauj lielākajā daļā.

Sintakse:

FETCH  BULK COLLECT INTO  LIMIT ;

Iepriekšminētajā sintaksē kursora ienešanas priekšraksts kopā ar klauzulu LIMIT izmanto paziņojumu BULK COLLECT.

BULK COLLECT atribūti

Līdzīgi kā kursora atribūtiem, BULK COLLECT ir% BULK_ROWCOUNT (n), kas atgriež rindu skaitu, kas ietekmēts FORALL priekšraksta n- tajā DML priekšrakstā, ti, tas sniegs FORALL paziņojumā ietekmēto ierakstu skaitu par katru atsevišķu vērtību no kolekcijas mainīgais. Termins “n” norāda vērtības secību kolekcijā, kurai nepieciešams rindu skaits.

1. piemērs : Šajā piemērā mēs projicēsim visu darbinieku vārdus no emp tabulas, izmantojot BULK COLLECT, un mēs arī palielināsim visu darbinieku algu par 5000, izmantojot 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;/

Rezultāts

Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYSalary Updated

Koda skaidrojums:

  • 2. koda rindiņa : paziņojuma “SELECT emp_name FROM emp” kursora deklarēšana guru99_det.
  • 3. koda rindiņa : lv_emp_name_tbl deklarēšana par VARCHAR2 tabulas tipu (50)
  • Kodu rinda 4 : deklarē lv_emp_name kā lv_emp_name_tbl tipu.
  • Kodu rinda 6: kursora atvēršana.
  • Kodu rinda 7: Kursora iegūšana, izmantojot BULK COLLECT ar mainīgo LIMIT kā 5000 intl lv_emp_name.
  • Kodu rinda 8-11: Cilpas FOR iestatīšana, lai izdrukātu visu ierakstu kolekcijā lv_emp_name.
  • Kodu rinda 12: Izmantojot FORALL, visa darbinieka alga tiek atjaunināta par 5000.
  • 14. koda rindiņa: Darījuma veikšana.