BULK COLLECT riduce i cambi di contesto tra il motore SQL e PL / SQL e consente al motore SQL di recuperare i record contemporaneamente.
Oracle PL / SQL fornisce la funzionalità di recuperare i record in blocco piuttosto che recuperarli uno per uno. Questo BULK COLLECT può essere utilizzato nell'istruzione "SELECT" per popolare i record in blocco o per recuperare il cursore in blocco. Poiché BULK COLLECT recupera il record in BULK, la clausola INTO dovrebbe sempre contenere una variabile del tipo di raccolta. Il vantaggio principale dell'utilizzo di BULK COLLECT è che aumenta le prestazioni riducendo l'interazione tra database e motore PL / SQL.
Sintassi:
SELECT BULK COLLECT INTO bulk_varaible FROM
;FETCH BULK COLLECT INTO ;
Nella sintassi precedente, BULK COLLECT viene utilizzato per raccogliere i dati dalle istruzioni "SELECT" e "FETCH".
In questo tutorial imparerai-
Clausola FORALL
Clausola LIMIT
BULK COLLECT Attributi
Clausola FORALL
Il FORALL consente di eseguire le operazioni DML sui dati in blocco. È simile a quello dell'istruzione ciclo FOR tranne che nel ciclo FOR le cose accadono a livello di record mentre in FORALL non esiste il concetto LOOP. Vengono invece elaborati contemporaneamente tutti i dati presenti nell'intervallo dato.
Sintassi:
FORALL in… ;
Nella sintassi precedente, l'operazione DML data verrà eseguita per tutti i dati presenti tra l'intervallo inferiore e quello superiore.
Clausola LIMIT
Il concetto di raccolta in blocco carica tutti i dati nella variabile di raccolta di destinazione come massa, ovvero tutti i dati verranno popolati nella variabile di raccolta in un unico passaggio. Ma questo non è consigliabile quando il record totale che deve essere caricato è molto grande, perché quando PL / SQL tenta di caricare tutti i dati consuma più memoria di sessione. Pertanto, è sempre opportuno limitare le dimensioni di questa operazione di raccolta in blocco.
Tuttavia, questo limite di dimensione può essere facilmente raggiunto introducendo la condizione ROWNUM nell'istruzione 'SELECT', mentre nel caso del cursore ciò non è possibile.
Per ovviare a questo Oracle ha fornito la clausola "LIMIT" che definisce il numero di record che devono essere inclusi nella massa.
Sintassi:
FETCH BULK COLLECT INTO LIMIT ;
Nella sintassi precedente, l'istruzione fetch del cursore utilizza l'istruzione BULK COLLECT insieme alla clausola LIMIT.
BULK COLLECT Attributi
Simile agli attributi del cursore BULK COLLECT ha% BULK_ROWCOUNT (n) che restituisce il numero di righe interessate nell'n- esima istruzione DML dell'istruzione FORALL, ovvero fornirà il conteggio dei record interessati nell'istruzione FORALL per ogni singolo valore della raccolta variabile. Il termine "n" indica la sequenza di valori nella raccolta, per la quale è necessario il conteggio delle righe.
Esempio 1 : in questo esempio, proietteremo tutto il nome del dipendente dalla tabella emp utilizzando BULK COLLECT e aumenteremo anche lo stipendio di tutti i dipendenti di 5000 utilizzando 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;/