使用DBMS_JOB来调度作业

使用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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值