Oracle
 sql >> Database >  >> RDS >> Oracle

Aumenta le prestazioni con la raccolta in blocco in Oracle

Utilizza la raccolta in blocco per recuperare più righe di dati in un'unica operazione di recupero . Più righe di dati in un unico recupero riducono il numero di round trip di rete e migliorano le prestazioni.
L'esempio seguente descrive il lavoro elencato nella tabella JOB_HISTORY era il lavoro svolto dal dipendente ma anche il lavoro a cui è andato il dipendente dopo il lavoro elencato nella tabella JOB_HISTORY.
PROCEDURA CREATE O REPLACE Promotion_Rev

IS
old_job hr.job_history.job_id%TYPE;
new_job hr.job_history.job_id%TYPE;
nincr NUMBER;

CURSOR cselectjob
IS
SELECT employee_id,
start_date,
end_date,
job_id
FROM hr.job_history
ORDER BY employee_id, start_date;

TYPE jh_rec IS RECORD (
employee_id hr.job_history.employee_id%TYPE,
start_date hr.job_history.start_date%TYPE,
end_date hr.job_history.end_date%TYPE,
job_id hr .job_history.job_id%TYPE
);

TYPE jh_table IS TABLE OF jh_rec
INDEX BY PLS_INTEGER;

jh_table_array jh_table;
BEGIN
OPEN cselectjob;

FETCH cselectjob
RACCOGLI BULK IN jh_table_array;

CHIUDI cselectjob;

FOR counter IN jh_table_array.FIRST .. jh_table_array.LAST
LOOP
IF counter =jh_table_array.LAST
THEN
nincr :=0;
ELSE
nincr :=1;
FINE SE;

old_job :=jh_table_array (contatore).job_id;

SE jh_table_array (contatore).employee_id =
jh_table_array (contatore + nincr).employee_id
THEN
nuovo_lavoro :=jh_table_array (contatore + nincr).job_id;
ALTRO
SELECT job_id
INTO new_job
FROM hr.employees
WHERE hr.employees.employee_id =
jh_table_array (counter).employee_id;
END IF;

DBMS_OUTPUT.put_line( 'Impiegato '
|| jh_table_array (contatore).employee_id
|| ' aveva un lavoro '
|| vecchio_lavoro
|| ' per '
| | (jh_table_array (counter).end_date
- jh_table_array (counter).start_date)
|| ' giorni e spostato al lavoro '
|| nuovo_lavoro
|| '.');
FINE CICLO;
FINE;
/

Eseguire la seguente procedura:

imposta serveroutput su;
BEGIN
promozione_rev;
END;
/
L'output dovrebbe essere simile a questo:

Il dipendente 101 ha avuto un lavoro AC_ACCOUNT per 1497 giorni ed è passato al lavoro AC_MGR.
Il dipendente 101 ha avuto un lavoro AC_MGR per 1234 giorni ed è passato al lavoro AD_VP.
Il dipendente 102 ha avuto un lavoro IT_PROG per 2018 giorni ed è passato al lavoro AD_VP.
Il dipendente 114 ha avuto un lavoro ST_CLERK per 647 giorni ed è passato al lavoro PU_MAN.
Il dipendente 122 ha avuto un lavoro ST_CLERK per 364 giorni ed è passato al lavoro ST_MAN.
Il dipendente 176 ha avuto un lavoro SA_REP per 282 giorni e si è trasferito al lavoro SA_MAN.
Il dipendente 176 ha avuto un lavoro SA_MAN per 364 giorni ed è passato al lavoro SA_REP.
Il dipendente 200 ha avuto un lavoro AD_ASST per 2100 giorni ed è passato al lavoro AC_ACCOUNT.
Il dipendente 200 aveva un lavoro AC_ACCOUNT per 1644 giorni e spostato al lavoro AD_ASST.
Il dipendente 201 ha avuto il lavoro MK_REP per 1401 giorni ed è passato al lavoro MK_REP.
Procedura PL/SQL completata con successo.