oracle job入门【原】
oracle job入门
准备工作
先做一张学生表Table
表STUDENT
create table STUDENT ( id INTEGER, name VARCHAR2(100), age INTEGER, crt_date DATE )
准备一个存储过程Procedure
存过PROC_INSERT_STUDENT , 该存过一直往表里插数据,是为了方便观测job执行效果.
CREATE OR REPLACE PROCEDURE PROC_INSERT_STUDENT AS ID INTEGER;--id BEGIN SELECT COUNT(*) INTO ID FROM STUDENT;--根据行数生成id ID := ID + 1;-- id+1 INSERT INTO STUDENT VALUES (ID, 'bobo', 18, SYSDATE);--插表 DBMS_OUTPUT.PUT_LINE(ID);--打印 COMMIT;-- END;
开始设置配置job
oracle 10g开始引入了DBMS_SCHEDULE包,可以将job需要的各种资源模块化 , 用于替代老旧的的DBMS_JOB包.
方式一: 新版 DBMS_SCHEDULER.CREATE_JOB(...) 强烈建议
--创建job,每周日的01:00:00执行存过STORED_PROCEDURE删除60天以前各表数据 BEGIN SYS.DBMS_SCHEDULER.CREATE_JOB( --job名 JOB_NAME => 'JOB_INSERT_STUDENT', --job类型:PLSQL_BLOCK , STORED_PROCEDURE , EXECUTABLE JOB_TYPE => 'STORED_PROCEDURE', --procedure名 JOB_ACTION => 'PROC_INSERT_STUDENT', --开始时间 START_DATE => TO_DATE(NULL), --频率(以下意为分钟一次,且在每分钟的01秒执行) REPEAT_INTERVAL => 'Freq=Minutely;Interval=1;BySecond=01', --结束时间 END_DATE => TO_DATE(NULL), --job类 JOB_CLASS => 'DEFAULT_JOB_CLASS', --创建后自动激活 ENABLED => TRUE, --自动删除: 默认true,即当job执行完毕都到期是否直接删除job AUTO_DROP => FALSE, --注释 COMMENTS => 'job说明-插数据到STUDENT表'); END; /
JOB_TYPE -job类型说明:
- PLSQL_BLOCK : 用于执行oracle语句(这个不建议用)
- STORED_PROCEDURE : 用于执行存过(建议使用,最常用)
- EXECUTABLE : 用于执行某些程序脚本语句,如shell脚本.(偶尔)
这种方式创建的job 在plsql的 jobs窗口可以很方便的查看/编辑
方式二: 旧版 DBMS_JOB.SUBMIT(...) 不建议
该方式最令人讨厌的地方在于 "频率配置" 晦涩难懂反人类.
-- 声明job DECLARE myjob NUMBER; BEGIN DBMS_JOB.SUBMIT(myjob, -- 这个参数是out类型 'PROC_INSERT_STUDENT;', SYSDATE, 'SYSDATE+60/(24*60*60)' ); -- 每60秒一次(即每分钟一次) COMMIT; DBMS_OUTPUT.PUT_LINE(myjob); -- 输出 被赋值的 myjob 变量值 END;
查看job
-- 查看刚建立的job id SELECT * FROM SYS.USER_JOBS
管理job
-- 运行job BEGIN DBMS_JOB.RUN(173); COMMIT; END; -- 停止job BEGIN DBMS_JOB.BROKEN(173, TRUE); COMMIT; END; -- 删除job DECLARE BEGIN DBMS_JOB.REMOVE(173); COMMIT; END;
特别声明,在设置每周频率的时候,中文环境要输"星期X",而英文环境要输"SUNDAY",如下
declare job_id number; begin sys.dbms_job.submit(job_id, 'PROC_INSERT_STUDENT;', sysdate, 'NEXT_DAY(TRUNC(SYSDATE ), ''星期日'' ) + 12/24'); --马上运行,然后每分钟运行一次 end;
总结:
10g开始的新版DBMS_SCHEDULER.CREATE_JOB(...) 比 旧版DBMS_JOB.SUBMIT(...)强大灵活又易理解太多,如果不是版本太旧的原因,一定要用新版去管理job
感觉空虚寂寞,只是因为你无所关注,无处付出。