Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Aumente o desempenho com a coleta em massa no Oracle

Use a coleta em massa para recuperar várias linhas de dados em uma única operação de busca . Várias linhas de dados em uma única busca reduzem o número de viagens de ida e volta da rede e melhoram o desempenho.
O exemplo a seguir descreve o trabalho listado na tabela JOB_HISTORY era o trabalho que o funcionário tinha, mas também o trabalho para o qual o funcionário foi após o trabalho listado na tabela JOB_HISTORY.
CREATE OR REPLACE PROCEDURE Promotion_Rev
IS
antigo_job hr.job_history.job_id%TYPE;
new_job hr.job_history.job_id%TYPE;
nincr NUMBER;

CURSOR cselectjob
IS
SELECT employee_id,
data_inicial,
data_final,
job_id
FROM hr.job_history
ORDER BY employee_id, data_inicial;

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

TIPO jh_table É TABELA DE jh_rec
ÍNDICE POR PLS_INTEGER;

jh_table_array jh_table;
BEGIN
OPEN cselectjob;

FETCH cselectjob
BULK COLLECT INTO jh_table_array;

FECHAR 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;
FIM SE;

old_job :=jh_table_array (contador).job_id;

SE jh_table_array (contador).employee_id =
jh_table_array (contador + nincr).employee_id
ENTÃO
new_job :=jh_table_array (contador + nincr).job_id;
ELSE
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
|| ' had job '
|| old_job
|| ' for '
| | (jh_table_array (counter).end_date
- jh_table_array (counter).start_date)
|| ' dias e movido para o trabalho '
|| new_job
|| '.');
FIM DO LOOP;
FIM;
/

Execute o seguinte procedimento:

set serveroutput on;
BEGIN
promotion_rev;
END;
/
A saída deve ser algo assim:

O funcionário 101 tinha o trabalho AC_ACCOUNT por 1497 dias e mudou para o trabalho AC_MGR.
O funcionário 101 tinha o trabalho AC_MGR por 1234 dias e mudou para o trabalho AD_VP.
O funcionário 102 tinha o trabalho IT_PROG por 2018 dias e mudou para o trabalho AD_VP.
O funcionário 114 tinha o emprego ST_CLERK por 647 dias e mudou para o emprego PU_MAN.
O funcionário 122 tinha o emprego ST_CLERK por 364 dias e mudou para o emprego ST_MAN.
O funcionário 176 tinha o emprego SA_REP por 282 dias e se mudou para o trabalho SA_MAN.
O funcionário 176 tinha o trabalho SA_MAN por 364 dias e mudou para o trabalho SA_REP.
O funcionário 200 tinha o trabalho AD_ASST por 2100 dias e mudou para o trabalho AC_ACCOUNT.
O funcionário 200 tinha o trabalho AC_ACCOUNT para 1644 dias e movido para o trabalho AD_ASST.
O funcionário 201 tinha o trabalho MK_REP por 1401 dias e mudou para o trabalho MK_REP.
Procedimento PL/SQL concluído com sucesso.