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.