El siguiente ejemplo describe el trabajo enumerado en la tabla JOB_HISTORY que era el trabajo que tenía el empleado, pero también el trabajo al que asistió después de la trabajo enumerado en la tabla JOB_HISTORY.
CREAR O REEMPLAZAR PROCEDIMIENTO Promotion_Rev
IS
antiguo_trabajo hr.job_history.job_id%TYPE;
nuevo_trabajo hr.job_history.job_id%TYPE;
nincr NUMBER;
CURSOR cselectjob
ES
SELECCIONAR id_empleado,
fecha_inicio,
fecha_finalización,
id_trabajo
FROM hr.historial_trabajo
ORDENAR POR id_empleado, fecha_inicio;
TIPO jh_rec ES REGISTRO (
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 ES TABLA DE jh_rec
ÍNDICE POR PLS_INTEGER;
jh_table_array jh_table;
COMENZAR
ABRIR cselectjob;
FETCH cselectjob
RECOGIDA A GRANEL EN jh_table_array;
CERRAR cseleccionartrabajo;
FOR contador IN jh_table_array.FIRST .. jh_table_array.LAST
LOOP
IF contador =jh_table_array.LAST
THEN
nincr :=0;
ELSE
nincr :=1;
FIN SI;
old_job :=jh_table_array (contador).job_id;
IF jh_table_array (contador).id_empleado =
jh_table_array (contador + nincr).id_empleado
THEN
nuevo_trabajo :=jh_table_array (contador + nincr).job_id;
ELSE
SELECCIONE job_id
EN new_job
DESDE hr.employees
DONDE hr.employees.employee_id =
jh_table_array (contador).employee_id;
END IF;
DBMS_OUTPUT.put_line( 'Empleado '
|| jh_table_array (contador).employee_id
|| ' tenía trabajo '
|| antiguo_trabajo
|| ' for '
| | (jh_table_array (contador).fecha_final
- jh_table_array (contador).fecha_inicial)
|| ' días y movido al trabajo '
|| nuevo_trabajo
|| '.');
FIN DEL BUCLE;
FIN;
/
Ejecute el siguiente procedimiento:
configure serveroutput on;
BEGIN
Promotion_rev;
END;
/
La salida debería ser algo como esto:
El empleado 101 tuvo el trabajo AC_ACCOUNT durante 1497 días y pasó al trabajo AC_MGR.
El empleado 101 tuvo el trabajo AC_MGR durante 1234 días y pasó al trabajo AD_VP.
El empleado 102 tuvo el trabajo IT_PROG durante 2018 días y pasó al trabajo AD_VP.
El empleado 114 tuvo el trabajo ST_CLERK durante 647 días y se cambió al trabajo PU_MAN.
El empleado 122 tuvo el trabajo ST_CLERK durante 364 días y se cambió al trabajo ST_MAN.
El empleado 176 tuvo el trabajo SA_REP durante 282 días y se mudó al trabajo SA_MAN.
El empleado 176 tuvo el trabajo SA_MAN durante 364 días y se cambió al trabajo SA_REP.
El empleado 200 tuvo el trabajo AD_ASST durante 2100 días y se mudó al trabajo AC_ACCOUNT.
El empleado 200 tuvo el trabajo AC_ACCOUNT durante 1644 días y se trasladó al trabajo AD_ASST.
El empleado 201 tuvo el trabajo MK_REP durante 1401 días y se trasladó al trabajo MK_REP.
El procedimiento PL/SQL se completó con éxito.