概述
Oracle 10g之前,可以使用dbms_job来管理定时任务。10g之后,Oracle引入dbms_scheduler来替代先前的dbms_job,在功能方面,它比dbms_job提供了更强大的功能和更灵活的机制/管理。
DBMS_JOB包
DBMS_JOB包中包含有许多过程和方法
![5816d83c6b3c4f98462b9e85a8fd6bc1.png](https://img-blog.csdnimg.cn/img_convert/5816d83c6b3c4f98462b9e85a8fd6bc1.png)
![3e1c533cace64af8618ee2438103f295.png](https://img-blog.csdnimg.cn/img_convert/3e1c533cace64af8618ee2438103f295.png)
![74d6f3c0e1e777689078011cd2052954.png](https://img-blog.csdnimg.cn/img_convert/74d6f3c0e1e777689078011cd2052954.png)
![46ad8fc5ef1198714a92bdafa27af48a.png](https://img-blog.csdnimg.cn/img_convert/46ad8fc5ef1198714a92bdafa27af48a.png)
注意:执行上面的任何创建/删除/更改任务的过程后一定要马上commit。
否则不仅会造成更改无效,甚至很有可能造成一些奇怪的现象,比如job停止之类,切记!
JOB_QUEUE_PROCESSES
Oracle有专门的后台进程来执行任务队列。后台进程的数量通过JOB_QUEUE_PROCESSES来设置,可以设为0到1000。*JOB_QUEUE_INTERVAL从9i之后就被废弃了。
需要注意,如果配置了最多1000 个Jnnn进程,并不会看到真的有1000 个进程随数据库启动。相反,开始时只会启动一个进程,即作业队列协调器(CJQ0),它在作业队列表中看到需要运行的作业时,会启动Jnnn 进程。
如果Jnnn 进程完成其工作,并发现没有要处理的新作业,此时Jnnn 进程就会退出。
unix下面可以用ps -ef | grep ora_j 查看这些进程(J000, ... J999),
另外还有一个ora_cjq0_xxx的队列管理进程。
作业队列协调器(CJQ0)进程被唤醒时,它首先查看任务队列目录中所有的任务是否当前的时间超过了下一次运行的日期时间。检测到需要该时间立即执行的任务后,这些任务按照下一次执行日期的顺序依次执行。当开始执行一个任务时,其过程如下:
1)以任务所有者的用户名开始一个新的数据库会话。2)当任务第一次提交或是最后一次被修改时,更改会话NLS设置和目前就绪的任务相匹配。3)通过interval日期表达式和系统时间,计算下一次执行时间。4)执行任务定义的PL/SQL5)如果运行成功,任务的下一次执行日期(next_date)被更新,否则,失败计数加1。
相关数据字典
任务队列中的任务信息可以通过以下几个字典视图来查看。
![d91dcef3f18fb4e253b6fc0e1364dd11.png](https://img-blog.csdnimg.cn/img_convert/d91dcef3f18fb4e253b6fc0e1364dd11.png)
DBA_JOBS 和USER_JOBS中的字段。
![f5e7ed48d8f082ceb02ca61a537b2c2a.png](https://img-blog.csdnimg.cn/img_convert/f5e7ed48d8f082ceb02ca61a537b2c2a.png)
DBA_JOBS_RUNNING的字段含义
![211debcefcb7afec74ca9cf1a541f40e.png](https://img-blog.csdnimg.cn/img_convert/211debcefcb7afec74ca9cf1a541f40e.png)
dbms_job在oracle 10g后其实就比较少用了,不过建议大家还是做个简单了解,重点掌握dbms_scheduler,后面会分享dbms_scheduler方面的内容,感兴趣的朋友可以关注一下~
![698e97e29de49a8a004b5b803b92b089.gif](https://img-blog.csdnimg.cn/img_convert/698e97e29de49a8a004b5b803b92b089.gif)