Job在oracle数据库中就是一个定时任务,它可以按照人为设定,在规定的时间做规定的事。类似java语言中的timer(java.util.Timer),类似Linux中的crontab。
模拟场景
使用job定时调用存储过程向一张表中插入数据
准备表结构
create table JOB_TEST (card_id NUMBER not null,birth_day DATE); |
alter table JOB_TEST add constraint PK_TEST_JOB primary key (card_id); |
创建一个序列
create sequence SEQ_JOB_TEST minvalue 1 maxvalue 99999999 start with 1 increment by 1 cache 10; |
创建存储过程
create or replace procedure P_JOB_TEST is begin insert into job_test(card_id, birth_day) values(seq_job_test.nextval,sysdate); commit; end P_JOB_TEST; / |
创建job(每个job创建后,都会对应一个唯一的job号)
declare job_id number; begin sys.dbms_job.submit(job_id, 'P_JOB_TEST;', sysdate, 'sysdate+1/1440'); --立刻运行,然后每分钟运行一次 sys.dbms_output.put_line(job_id); --输出job Id end; / |
通过几个视图可以观察到job的运行情况
select * from dba_jobs; select * from dba_jobs_running; select * from all_jobs; select * from user_jobs; |
dba_jobs视图概览
| JOB | job身份标识 |
| LOG_USER | 提交任务的用户 |
| PRIV_USER | 赋予任务权限的用户 |
| SCHEMA_USER | job的用户 |
| LAST_DATE | 最后一次成功运行任务的时间 |
| LAST_SEC | 最后一次成功运行任务的启始时间 |
| THIS_DATE | 正在运行任务的开始时间,如果没有运行任务则为null |
| THIS_SEC | 正在运行任务的开始时间,时间格式更精确 |
| NEXT_DATE | 下一次job运行时间 |
| NEXT_SEC | 上一次成功执行job的开始时间 |
| TOTAL_TIME | 该任务运行所需要的总时间,单位为秒 |
| BROKEN | 标志参数,Y标示任务中断,以后不会运行 |
| INTERVAL | 标志参数,Y标示任务中断,以后不会运行 |
| FAILURES | 任务运行连续没有成功的次数 |
| WHAT | 执行任务的PL/SQL块 |
| NLS_ENV | job的nls环境 |
| MISC_ENV | 适用于该job的其他会话参数 |
| INSTANCE | 可以执行或者正在执行job的实例号,默认为0 |
删除job
begin dbms_job.remove(3304); ---3304是job号 end; |
手动启动Job
begin dbms_job.remove(3304); --3304为具体的job ID end; |
手动停止一个job
首先查看目标job的运行状态
select * from dba_jobs_running where job=4403; |
将其置为broken状态
SQL> exec dbms_job.broken(4403,TRUE); SQL> commit; |
最后将该job的进程在操作系统上kill掉
注意:如果环境是rac,在每个实例上都要检查,有可能在node1上kill掉job进程,还会在node2,node3....上起来。




