这篇文章给大家详细介绍了dbms_job的用法,用于安排和管理作业队列,通过使用作业,可以使ORACLE数据库定期执行特定的任务。有需要的朋友们可以参考借鉴。
 

一、dbms_job涉及到的知识点

1、创建job:

1
2
3
4
5
6
variable jobno number;
dbms_job.submit(:jobno, —-job号 
 'your_procedure;',—-执行的存储过程, ';'不能省略 
 next_date, —-下次执行时间 
 'interval' —-每次间隔时间,interval以天为单位
);

–系统会自动分配一个任务号jobno。
2、删除job: dbms_job.remove(jobno);

3、修改要执行的操作: job:dbms_job.what(jobno, what); 

4、修改下次执行时间:dbms_job.next_date(jobno, next_date);

5、修改间隔时间:dbms_job.interval(jobno, interval);

6、启动job: dbms_job.run(jobno);

7、停止job: dbms.broken(jobno, broken, nextdate);
–broken为boolean值

二、初始化相关参数job_queue_processes

1、job_queue_process表示oracle能够并发的job的数量,当job_queue_process值为0时表示全部停止oracle的job。

2、查看job_queue_processes参数

方法一:

1
show parameter job_queue_process;

方法二:

1
select * from v$parameter where name='job_queue_processes';

3、修改job_queue_processes参数

1
alter system set job_queue_processes = 10;

三、user_jobs表结构

1
2
3
4
5
6
7
8
9
10
字段(列) 类型 描述
job number 任务的唯一标示号
log_user varchar2(30) 提交任务的用户
priv_user varchar2(30) 赋予任务权限的用户
schema_user varchar2(30) 对任务作语法分析的用户模式
last_date date 最后一次成功运行任务的时间
last_sec varchar2(8) 如hh24:mm:ss格式的last_date日期的小时,分钟和秒
this_date date 正在运行任务的开始时间,如果没有运行任务则为null
this_sec varchar2(8) 如hh24:mm:ss格式的this_date日期的小时,分钟和秒
next_date date 下一次定时运行任务的时间

以下使用一个案例来演示dbms_job的使用

一、在plsql中创建表:

1
2
3
4
create table t(
 id varchar2(30),
 name varchar2(30)
);

二、在plsql中创建存储过程:

1
2
3
4
5
6
create or replace procedure proce_t is
begin
 insert into t(id, name) values('1', to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'));
 commit;
end proce_t;
/

三、创建job任务(1分钟执行一次):

在sql>后执行:

1
2
3
4
5
6
variable jobno number;
begin
 dbms_job.submit(:jobno,'proce_t;', sysdate, 'sysdate+1/24/60');
 commit;
end;
/

提交后提示:

1
2
3
4
pl/sql procedure successfully completed
jobno
---------
25

四、跟踪任务的情况(查看任务队列):

1
2
3
4
5
sql> select job, next_date, next_sec, failures, broken from user_jobs;
   
 job next_date next_sec failures broken
---------- ----------- ---------------- ---------- ------
 25 2012/9/14 1 10:59:46 0 n

说明任务已创建成功。

执行select * from t;查看定时任务的结果。可以看出定时任务是正常执行了的。

五、停止定时任务

1、查看定时任务的job号。

1
2
3
4
5
sql> select job, next_date, next_sec, failures, broken from user_jobs; 
   
 job next_date next_sec failures broken
---------- ----------- ---------------- ---------- ------
 25 2012/9/14 1 11:01:48 0 n

2、停止一个已启动的定时任务:

1
2
3
4
5
begin
 dbms_job.broken(25, true, sysdate);
 commit;
end;
/

表示停止job为25的任务。

执行后显示如下:

1
pl/sql procedure successfully completed

3、查看定时任务是否已停止成功

1
2
3
4
5
sql> select job, next_date, next_sec, failures, broken from user_jobs; 
   
 job next_date next_sec failures broken
---------- ----------- ---------------- ---------- ------
 25 4000/1/1 00:00:00 0 y

broken值为y,表示定时任务已停止。

六、启动定时任务

1、查看停止定时任务

1
2
3
4
5
sql> select job, next_date, next_sec, failures, broken from user_jobs; 
   
 job next_date next_sec failures broken
---------- ----------- ---------------- ---------- ------
 25 4000/1/1 00:00:00 0 y

broken值为y,表示定时任务已停止。

2、启动定时任务

1
2
3
4
5
begin
 dbms_job.run(25);
 commit;
end;
/

3、查看定时任务是否已启动

1
2
3
4
5
sql> select job, next_date, next_sec, failures, broken from user_jobs;
   
 job next_date next_sec failures broken
---------- ----------- ---------------- ---------- ------
 25 2012/9/14 1 11:06:17 0 n

broken值为n,表示定时任务启动成功。

七、查看进程数

1
show parameter job_queue_processes;

必须大于0,否则执行下面的命令修改:

1
alter system set job_queue_processes=10;

八、再创建一个任务(每5分钟执行一次):

1
2
3
4
5
6
variable jobno number;
begin
 dbms_job.submit(:jobno, 'proce_t;', sysdate, 'sysdate+1/24/12'); --interval是以天为单位的
 commit;
end;
/

九、 执行

1
select job,next_date,next_sec,failures,broken from user_jobs;

结果:

1
2
3
4
5
6
sql> select job,next_date,next_sec,failures,broken from user_jobs; 
   
 job next_date next_sec failures broken
---------- ----------- ---------------- ---------- ------
 26 2012/9/14 1 11:12:08 0 n
 25 2012/9/14 1 11:07:18 0 n

十、总结

关于job运行时间

1:每分钟执行

1
Interval => TRUNC(sysdate,'mi') + 1/(24*60)

2:每天定时执行

例如:每天的凌晨1点执行

1
Interval => TRUNC(sysdate) + 1 +1/(24)

3:每周定时执行

例如:每周一凌晨1点执行

1
Interval => TRUNC(next_day(sysdate,'星期一'))+1/24

4:每月定时执行

例如:每月1日凌晨1点执行

1
Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24

5:每季度定时执行

例如每季度的第一天凌晨1点执行

1
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24

6:每半年定时执行

例如:每年7月1日和1月1日凌晨1点

1
Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24

7:每年定时执行

例如:每年1月1日凌晨1点执行

1
Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'), 12)+1/24

job的运行频率设置

1.每天固定时间运行,比如早上8:10分钟:Trunc(Sysdate+1) + (8*60+10)/24*60

2.Toad中提供的:

每天:trunc(sysdate+1)

每周:trunc(sysdate+7)

每月:trunc(sysdate+30)

每个星期日:next_day(trunc(sysdate),'星期日')

每天6点:trunc(sysdate+1)+6/24

半个小时:sysdate+30/(24*60)

3.每个小时的第15分钟运行,比如:8:15,9:15,10:15…:trunc(sysdate,'hh')+(60+15)/(24*60)

总结

以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作带来一定的帮助,如果有疑问大家可以留言交流。

最新文章

  1. myaudio.duration为null的解决办法
  2. MVC5+EF6 入门完整教程十
  3. Gradle basic
  4. mysql 语句解释执行顺序
  5. MyEclipse启动Tomcat服务器时老是跳到Debug调试上
  6. 哈希(Hash)与加密(Encrypt)的基本原理、区别及工程应用
  7. 解决远程连接mysql错误1130
  8. ORACLE 语句关联统计
  9. ios Swift 国外资源
  10. linq to sql 扩展方法
  11. HDU 1087 Super Jumping! Jumping! Jumping!(动态规划)
  12. zookeeper笔记
  13. SVNKIT的SVNCommitClient的doMkDir的操作
  14. vi命令
  15. 性能优化实战案例——助力某移动OA系统
  16. LeetCode315—Count of Smaller Numbers After Self—Java版归并算法
  17. 统一配置管理 windows linux ide maven gradle docker 【渐进式备份更新~~】
  18. VS Code 配置 C/C++ 环境(转)
  19. Java学习之基本数据类型和引用数据类型区别
  20. HTML5 Canvas 超炫酷烟花绽放动画教程

热门文章

  1. Xcode 控制台打印Unicode字符串转换为中文
  2. JavaWeb日常笔记
  3. 怎样在Win7系统中搭建Web服务器
  4. micro:bit 软件生态系统介绍
  5. nohup和&后台运行,进程查看及终止 详解
  6. DotNetty学习笔记
  7. Simulating Mouse Events in JavaScript
  8. class kind type sort区别
  9. [BZOJ3218]a + b Problem-[主席树+网络流-最小割]
  10. 优步uber司机常见问题与答案(成都地区官方)