Das folgende Beispiel beschreibt den Job, der in der JOB_HISTORY-Tabelle aufgeführt ist, den Job, den der Mitarbeiter hatte, aber auch den Job, zu dem der Mitarbeiter danach gewechselt ist Job, der in der Tabelle JOB_HISTORY aufgeführt ist.
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 (
mitarbeiter_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
BULK COLLECT INTO jh_table_array;
CLOSE 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;
END IF;
old_job :=jh_table_array (counter).job_id;
IF jh_table_array (counter).employee_id =
jh_table_array (counter + nincr).employee_id
THEN
new_job :=jh_table_array (counter + 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( 'Mitarbeiter '
|| jh_table_array (counter).employee_id
|| ' hatte Job '
|| alter_job
|| ' für '
| | (jh_table_array (counter).end_date
- jh_table_array (counter).start_date)
|| ' Tage und wechselte zu Job '
|| new_job
|| '.');
SCHLEIFE ENDE;
ENDE;
/
Führen Sie die folgende Prozedur aus:
set serveroutput on;
BEGIN
promotion_rev;
END;
/
Die Ausgabe sollte in etwa so aussehen:
Mitarbeiter 101 hatte Job AC_ACCOUNT für 1497 Tage und wechselte zu Job AC_MGR.
Mitarbeiter 101 hatte Job AC_MGR für 1234 Tage und wechselte zu Job AD_VP.
Mitarbeiter 102 hatte Job IT_PROG für 2018 Tage und wechselte zu Job AD_VP.
Mitarbeiter 114 hatte 647 Tage Job ST_CLERK und wechselte zu Job PU_MAN.
Mitarbeiter 122 hatte 364 Tage Job ST_CLERK und wechselte zu Job ST_MAN.
Mitarbeiter 176 hatte 282 Tage Job SA_REP und wechselte zu Job SA_MAN.
Mitarbeiter 176 hatte Job SA_MAN für 364 Tage und wechselte zu Job SA_REP.
Mitarbeiter 200 hatte Job AD_ASST für 2100 Tage und wechselte zu Job AC_ACCOUNT.
Mitarbeiter 200 hatte Job AC_ACCOUNT für 1644 Tage und wechselte zu Job AD_ASST.
Mitarbeiter 201 hatte Job MK_REP für 1401 Tage und wechselte zu Job MK_REP.
PL/SQL-Prozedur erfolgreich abgeschlossen.