DBMS_SCHEDULER的使用
DBMS_SCHEDULER的使用
1.通过DBMS_SCHEDULER.CREATE_JOB直接创建job
[sql]
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
[sql]
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
[sql]
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,