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_scheduler介绍

oracle使用DBMS_SCHEDULER调度作业

 

方式二: 旧版 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;

 

oracle job 使用

oracle job 定时执行 存储过程

 

 

总结:

10g开始的新版DBMS_SCHEDULER.CREATE_JOB(...) 比 旧版DBMS_JOB.SUBMIT(...)强大灵活又易理解太多,如果不是版本太旧的原因,一定要用新版去管理job

posted @ 2016-02-29 20:17  苦涩泪滴  阅读(963)  评论(0编辑  收藏  举报