次の例では、JOB_HISTORYテーブルにリストされているジョブが、従業員の仕事であると同時に、従業員がJOB_HISTORYテーブルにリストされているジョブ。
手順の作成または置換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
);
タイプjh_tableはjh_recのテーブルです
PLS_INTEGERによるインデックス;
jh_table_array jh_table;
BEGIN
OPEN cselectjob;
FETCH cselectjob
BULK COLLECT INTO jh_table_array;
cselectjobを閉じる;
FORカウンターINjh_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('従業員'
|| jh_table_array(counter).employee_id
||'仕事がありました'
|| old_job
||'for'
| |(jh_table_array(counter).end_date
--jh_table_array(counter).start_date)
||'日数とジョブに移動'
|| new_job
||'。');
END LOOP;
END;
/
次の手順を実行します。
serveroutputをオンに設定します;
BEGIN
Promotion_rev;
END;
/
出力は次のようになります:
従業員101のジョブAC_ACCOUNTは1497日間で、ジョブAC_MGRに移動しました。
従業員101のジョブAC_MGRは1234日間で、ジョブAD_VPに移動しました。
従業員102のジョブIT_PROGは2018日間で、ジョブAD_VPに移動しました。
従業員114のジョブST_CLERKは647日間で、ジョブPU_MANに移動しました。
従業員122のジョブST_CLERKは364日間で、ジョブST_MANに移動しました。
従業員176のジョブSA_REPは282日間で、移動しました。
従業員176のジョブSA_MANは364日間で、ジョブSA_REPに移動しました。
従業員200のジョブAD_ASSTは2100日間で、ジョブAC_ACCOUNTに移動しました。
従業員200のジョブAC_ACCOUNTは1644日でジョブAD_ASSTに移動しました。
従業員201は1401日間ジョブMK_REPを使用し、ジョブMK_REPに移動しました。
PL/SQLプロシージャは正常に完了しました。