首先创建一张测试表:
Sql代码??create?table?JOBTEST?(?ID?VARCHAR2(50)?primary?key,?NAME?VARCHAR2(20),?AGE?NUMBER(3)?)???然后写好定时器要调用的存储过程:Sql代码??create?or?replace?procedure?myprocedure?is?begin?insert?into?jobtest?values(to_char(sysdate,'yyyy-MM-dd?hh:mm:ss'),'july',22);?commit;?end;???接下来就要建立定时器了:
Sql代码??var?myjob?number;?begin?dbms_job.submit(:myjob,'myprocedure;',sysdate,'sysdate+1/24/60/60');?end;?????最后启动定时器:
Sql代码??begin?dbms_job.run(:myjob);?end;??????启动之后,该定时器(理论上)会一秒钟想数据表jobtest中插入一条记录。但是事实上每隔大概五秒才执行一次(原因未知)。
如果建立以上sql语句之后,定时器并未运行,请一dba角色运行select * from v$parameter t where t.name like 'job%';看value的值是多少,如果等于0,则将它设置为大于0的值即可:
可以在C:\oracle\admin\july\pfile\init.ora文件中修改但需要重启动数据库?(july指的是实例名):
??job_queue_interval?=?? 10??
? job_queue_processes?=??4;
? 如果不想重启动数据库??
? ALTER SYSTEM SET job_queue_processes=5;
查看定时器:以dba角色登录执行select?? *?? from?? dba_jobs;或者当前用户select * from user_jobs;
?删除定时器 begin dbms_job.remove(jobno);??? end;??? commit;jobno 为 job查询列表中的编号,删除后必须提交事务才能彻底删除。也可以以dba登录后从dba_jobs表中删除。
偶尔一些定时器执行时间很长,在其执行期间要将其停止,必须将其进程kill,然后等待其释放资源,相关语句:
Sql代码??select?*?from?V$session?t?order?by?t.USERNAME,t.SID;???Sql代码??select?sid,serial#,username,program,machine,status?from?v$session;?select?*?from?v$access?t?where?t.OWNER='july';???Sql代码??alter?system?kill?session?'x,y';????
定时器的参数说明:
myjob参数是由Submit()过程返回的binary_ineger。这个值用来唯一标识一个工作;
what参数是将被执行的PL/SQL代码块,这里指的是一个存储过程,注意名字后面的分号;
next_date参数指识何时将运行这个工作。写Job的时候可以不指定该值;
interval参数何时这个工作将被重执行。
关于interval的设置,参考以下几个例子:
1、 每分钟执行
Interval => TRUNC(sysdate,’mi’) + 1 / (24*60)
2、 每天定时执行
例如:每天的凌晨2点执行
Interval => TRUNC(sysdate) + 1 +2 / (24)
3、 每周定时执行
例如:每周一凌晨2点执行
Interval => TRUNC(next_day(sysdate,2))+2/24 --星期一,一周的第二天
4、 每月定时执行
例如:每月1日凌晨2点执行
Interval =>TRUNC(LAST_DAY(SYSDATE))+1+2/24
5、 每季度定时执行
例如每季度的第一天凌晨2点执行
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 2/24
6、 每半年定时执行
例如:每年7月1日和1月1日凌晨2点
Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+2/24
7、 每年定时执行
例如:每年1月1日凌晨2点执行
Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+2/24