日期:2014-05-16  浏览次数:20398 次

DBMS_SCHEDULER 的使用

1.通过DBMS_SCHEDULER.CREATE_JOB直接创建job

CREATE TABLE T_ROSANU
(
  R_ID   VARCHAR2(10),
  R_DATE TIMESTAMP(6)
);
--表已创建。
BEGIN
  DBMS_SCHEDULER.CREATE_JOB(JOB_NAME        => 'job_create_rosanu',
                            JOB_TYPE        => 'PLSQL_BLOCK',
                            JOB_ACTION      => 'BEGIN
                                                  INSERT INTO T_ROSANU VALUES ('' job '', SYSDATE);
                                                  COMMIT;
                                                END;',
                            ENABLED         => TRUE,
                            START_DATE      => SYSTIMESTAMP,
                            REPEAT_INTERVAL => 'SYSTIMESTAMP + 1/1440',
                            COMMENTS        => 'rosanu_create_job');
END;
--PL/SQL 过程已成功完成。
SELECT R_ID, TO_CHAR(R_DATE, 'yyyy-mm-dd hh24:mi:ss') FROM T_ROSANU;
/*
R_ID     TO_CHAR(R_DATE,'yyyy-mm-dd hh24:mi:ss)
-----------------------------------------------
job        2013-03-29 18:12:11
job        2013-03-29 18:13:11
job        2013-03-29 18:14:11
*/
这里的使用方法和dbms_jobs差不多,不过这个提供了加灵活的使用方法,比如可以执行匿名块和执行操作系统命令等;
2.CREATE_JOB结合CREATE_PROGRAM

CREATE OR REPLACE PROCEDURE PROC_ROSANU(IN_ID IN VARCHAR2) IS
BEGIN
  INSERT INTO T_ROSANU VALUES (IN_ID, SYSDATE);
  COMMIT;
END;
-- 过程已创建。

-- 创建Program 
BEGIN
  DBMS_SCHEDULER.CREATE_PROGRAM(PROGRAM_NAME        => 'program_rosanu',
                                PROGRAM_ACTION      => 'PROC_ROSANU',
                                PROGRAM_TYPE        => 'STORED_PROCEDURE',
                                NUMBER_OF_ARGUMENTS => 1,
                                COMMENTS            => 'Rosanu_PROGRAM',
                                ENABLED             => FALSE);
END;
-- PL/SQL 过程已成功完成。

--设置Program参数
BEGIN
  DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT(PROGRAM_NAME      => 'program_rosanu',
                                         ARGUMENT_POSITION => 1,
                                         ARGUMENT_TYPE     => 'VARCHAR2',
                                         DEFAULT_VALUE     => 'program');
END;
-- PL/SQL 过程已成功完成。 

--执行Program
EXEC DBMS_SCHEDULER.ENABLE('program_rosanu');
-- PL/SQL 过程已成功完成。 

-- 创建Job
BEGIN
  DBMS_SCHEDULER.CREATE_JOB(JOB_NAME        => 'job_rosanu',
                            PROGRAM_NAME    => 'program_rosanu',
                            COMMENTS        => 'rosanu_create_job',
                            REPEAT_INTERVAL => 'SYSTIMESTAMP + 1/1440',
                            AUTO_DROP       => FALSE,
                            ENABLED         => TRUE);
END;
--  PL/SQL 过程已成功完成。

SELECT R_ID, TO_CHAR(R_DATE, 'yyyy-mm-dd hh24:mi:ss') FROM T_ROSANU;

/*
R_ID     TO_CHAR(R_DATE,'yyyy-mm-dd hh24:mi:ss')
------------------------------------------------
job        2013-02-29 20:20:11
program    2013-02-29 20:20:09
program    2013-02-29 20:21:09
job        2013-02-29 20:21:11
*/
从这里使用的参数可以看出CREATE_PROGRAM把CREATE_JOB中的部分参数给独立出来,使得更加灵活的控制;

3.CREATE_JOB结合CREATE_PROGRAM和CREATE_SCHEDULE

exec DBMS_SCHEDULER.drop_job('job_create_rosanu'); 
--PL/SQL 过程已成功完成。 
truncate table t_rosanu; 
--表被截断。 
BEGIN
  DBMS_SCHEDULER.CREATE_SCHEDULE(REPEAT_INTERVAL => 'FREQ=MINUTELY;INTERVAL=1',
                                 START_DATE      => SYSDATE,
                                 COMMENTS        => 'rosanu_create_job',
                                 SCHEDULE_NAME   => 'SCHEDULE_ROSANU');
END;
-- PL/SQL 过程已成功完成。
 
BEGIN
  DBMS_SCHEDULER.CREATE_JOB(JOB_NAME      => 't_xifenfei_job',
                            PROGRAM_NAME  => 'program_rosanu',
                            COMMENTS      => 'rosanu_create_job',
                            SCHEDULE_NAME => 'SCHEDULE