Oracle PL / SQL BULK COLLECT: FORALL Esempio

Sommario:

Anonim

Cos'è BULK COLLECT?

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

Produzione

Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYSalary Updated

Spiegazione del codice:

  • Riga di codice 2 : dichiarazione del cursore guru99_det per l'istruzione "SELECT emp_name FROM emp".
  • Riga di codice 3 : dichiarazione di lv_emp_name_tbl come tipo di tabella di VARCHAR2 (50)
  • Riga di codice 4 : dichiarazione di lv_emp_name come tipo lv_emp_name_tbl.
  • Riga di codice 6: apertura del cursore.
  • Riga di codice 7: recupero del cursore utilizzando BULK COLLECT con la dimensione LIMIT come variabile 5000 intl lv_emp_name.
  • Riga di codice 8-11: impostazione del ciclo FOR per stampare tutto il record nella raccolta lv_emp_name.
  • Riga di codice 12: utilizzando FORALL aggiornare lo stipendio di tutto il dipendente di 5000
  • Riga di codice 14: commit della transazione.