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