Oracle
 sql >> Base de données >  >> RDS >> Oracle

Augmentez les performances avec la collecte en masse dans Oracle

Utilisez Bulk Collect pour récupérer plusieurs lignes de données en une seule opération de récupération. Plusieurs lignes de données en une seule extraction réduisent le nombre d'allers-retours sur le réseau et améliorent les performances.
L'exemple suivant décrit le travail répertorié dans la table JOB_HISTORY était le travail de l'employé, mais également le travail auquel l'employé s'est rendu après la emploi répertorié dans la table JOB_HISTORY.
CREATE OR REPLACE PROCEDURE 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 (
id_employé 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 EST UNE TABLE DE jh_rec
INDEX PAR PLS_INTEGER ;

jh_table_array jh_table;
COMMENCER
OUVRIR cselectjob;

FETCH cselectjob
BULK COLLECT INTO jh_table_array;

FERMER 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;
FIN SI;

old_job :=jh_table_array (compteur).job_id;

SI jh_table_array (compteur).employee_id =
jh_table_array (compteur + nincr).employee_id
ALORS
new_job :=jh_table_array (compteur + nincr).job_id;
SINON
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( 'Employee '
|| jh_table_array (counter).employee_id
|| ' avait un emploi '
|| old_job
|| ' for '
| | (jh_table_array (counter).end_date
- jh_table_array (counter).start_date)
|| ' jours et déplacé vers le travail '
|| new_job
|| '.');
FIN BOUCLE;
FIN;
/

Exécutez la procédure suivante :

set serveroutput on;
BEGIN
promotion_rev;
END;
/
La sortie devrait ressembler à ceci :

L'employé 101 a occupé le poste AC_ACCOUNT pendant 1 497 jours et est passé au poste AC_MGR.
L'employé 101 a occupé le poste AC_MGR pendant 1 234 jours et est passé au poste AD_VP.
L'employé 102 a occupé le poste IT_PROG pendant 2018 jours et est passé au poste AD_VP.
L'employé 114 a occupé le poste ST_CLERK pendant 647 jours et est passé au poste PU_MAN.
L'employé 122 a occupé le poste ST_CLERK pendant 364 jours et a déménagé au poste ST_MAN.
L'employé 176 a occupé le poste SA_REP pendant 282 jours et a déménagé à l'emploi SA_MAN.
L'employé 176 a occupé l'emploi SA_MAN pendant 364 jours et est passé à l'emploi SA_REP.
L'employé 200 a occupé l'emploi AD_ASST pendant 2 100 jours et a été transféré à l'emploi AC_ACCOUNT.
L'employé 200 a occupé l'emploi AC_ACCOUNT pendant 1 644 jours et a été muté au poste AD_ASST.
L'employé 201 a occupé le poste MK_REP pendant 1 401 jours et a été muté au poste MK_REP.
Procédure PL/SQL terminée avec succès.