使用ORACLE提供的DBMS_JOB,可以调度PL/SQL过程的执行。这个包是PL/SQL2.2版本中引入的。DBMS_JOB是一个向用户提供的ORACLE PL/SQL包。向作业队列提交一个作业,并在指定时间允许这个作业。用户也可输入参数,以指定作业的执行的频繁程度。作业可以由PL/SQ代码组成。
SUBMIT 往作业队列中输入作为作业的PL/SQL过程
REMOVE 往作业队列中删除以前提交的PL/SQL过程
CHANGE 更改已提交的作业参数(描述,下次运行时间,或者执行时间间隔)
INTERVAL 改变作业队列中某已存在作业执行间隔时间
NEXT_DATE 改变某已存在的作业的下次执行时间
RUN 强迫作业队列中某作业运行,不管作业调度如何
范例:创建过程DELETE_ENROLL:如果GRADE表中没有该学生的成绩,并且班级的开班时间已经过去一个月了,则删除这个学生的注册记录。
1.CREATE OR REPLACE PROCEDURE delete_enroll AS
CURSOR c_no_grades IS
SELECT st.student_id, se.section_id
FROM student st, enrollment e, section se
WHERE st.student_id = e.student_id
AND e.section_id = se.section_id
AND se.start_date_time < add_months(SYSDATE, -1)
AND NOT EXISTS (SELECT g.student_id, g.section_id
FROM grade g
WHERE g.student_id = st.student_id
AND g.section_id = se.section_id);
BEGIN
FOR r IN c_no_grades
LOOP
DELETE enrollment
WHERE section_id = r.section_id
AND student_id = r.student_id;
END LOOP;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
END;
2.像作业队列提交过程DELETE_ENROLL,每月执行一次该过程。
DECLARE
v_job_no NUMBER;
BEGIN
dbms_job.submit(job => v_job_no,
what => 'DELETE_ENROLL;',
next_date => SYSDATE,
INTERVAL => 'ADD_MONTHS(SYSDATE,1)');
COMMIT;
dbms_output.put_line(v_job_no);
END;