实现的功能:每隔一分钟自动向test_table表中插入当前的系统时间。
1、创建表
SQL> show user;
USER 为 "SCOTT"
SQL> create table test_table(a date);
表已创建。
2、创建存储过程
SQL> create or replace procedure test
2 as
3 begin
4 insert into test_table values(sysdate);
5 end;
6 /
过程已创建。
3、创建job,每分钟运行一次test的存储过程
SQL> variable job1 number;
SQL> begin
2 dbms_job.submit(:job1,'test;',sysdate,'sysdate+1/1440');//test 刚刚创建的存储过程
3 end;
4 /
PL/SQL 过程已成功完成。
或者这样执行:
begin
sys.dbms_job.submit(job => :job,
what => 'check_err;',
next_date => trunc(sysdate)+23/24,
interval => 'trunc(next_day(sysdate,''星期五''))+23/24');
commit;
end;
4、查看job的id
SQL> select job,priv_user from user_jobs;
JOB PRIV_USER
---------- ------------------------------
161 SCOTT
5、执行job
SQL> begin
2 dbms_job.run(:job1);
3 end;
4 /
PL/SQL 过程已成功完成。
SQL> select * from test_table;
A
-----------
22/6/2010 P
22/6/2010 P
22/6/2010 P
22/6/2010 P
22/6/2010 P
22/6/2010 P
22/6/2010 P
22/6/2010 P
22/6/2010 P
22/6/2010 P
22/6/2010 P
22/6/2010 P
22/6/2010 P
22/6/2010 P
22/6/2010 P
22/6/2010 P
36 rows selected
或者这样执行:
SQL> execute dbms_job.run(27);
PL/SQL 过程已成功完成。
SQL> select to_char(a,'yyyy/mm/dd hh24:mm:ss') from test_table;
TO_CHAR(A,'YYYY/MM/DDHH24:MM:S
------------------------------
2010/06/22 22:06:52
2010/06/22 22:06:11
2010/06/22 22:06:54
2010/06/22 22:06:59
6、在sys用户下执行其他用户的job
SQL> conn /as sysdba
已连接。
SQL> select job from dba_jobs;
JOB
----------
1 27
SQL> execute dbms_ijob.run(27);
PL/SQL 过程已成功完成。
7、其他的普通用户怎么执行job呢,需要sys用户授予执行dbms_ijob的权限
SQL> conn /as sysdba
已连接。
SQL> grant execute on dbms_ijob to zhangsan;
授权成功。
SQL> conn zhangsan/zhangsan
已连接。
SQL> execute sys.dbms_ijob.run(27);
PL/SQL 过程已成功完成。
SQL> conn scott/mzl
已连接。
SQL> select to_char(a,'yyyy/mm/dd hh24:mm:ss') from test_table;
TO_CHAR(A,'YYYY/MM/DDHH24:MM:S
------------------------------
2010/06/22 22:06:52
2010/06/22 22:06:11
2010/06/22 22:06:54
2010/06/22 22:06:59
SQL> select job from user_jobs;
JOB
----------
161
8、删除job
SQL> execute dbms_job.remove(27);
PL/SQL 过程已成功完成。
SQL> select job from user_jobs;
未选定行
部分重点参数补充说明:
DBMS_JOB.SUBMIT(:jobno,//job号
'your_procedure;',//要执行的过程
trunc(sysdate)+1/24,//下次执行时间
'trunc(sysdate)+1/24+1'//每次间隔时间
);
删除job:dbms_job.remove(jobno);
修改要执行的操作:job:dbms_job.what(jobno,what);
修改下次执行时间:dbms_job.next_date(job,next_date);
修改间隔时间:dbms_job.interval(job,interval);
停止job:dbms.broken(job,broken,nextdate);
启动job:dbms_job.run(jobno);
修改job_queue_processes的值:(保证其不为0否则JOB不自动运行)
可通过select * from v$parameter;查看其值;
或者直接用show parameter job_queue_processes;查看如下:
NAME TYPE VALUE
--------------- ----------- ------------
job_queue_processes integer 10
show parameter JOB_QUEUE_INTERVAL
250
方法1.startup pfile='C:oracleora90databaseinitorcl.ora';
//这个方法用来修改initorcl.ora文件的job_queue_processes参数,然后重新启动数据库
方法2.alter system set job_queue_processes=10
//这个方法不用重启数据库就可以生效,系统自动修改init.ora文件以后即可生效 。
视图名 描述
DBA_JOBS 本数据库中定义到任务队列中的任务
DBA_JOBS_RUNNING 目前正在运行的任务
USER_JOBS 当前用户拥有的任务
1:每分钟执行
Interval => TRUNC(sysdate,'mi') + 1/ (24*60)
或
Interval => sysdate+1/1440
2:每天定时执行
例如:每天的凌晨1点执行
Interval => TRUNC(sysdate) + 1 +1/ (24)
3:每周定时执行
例如:每周一凌晨1点执行
Interval => TRUNC(next_day(sysdate,'星期一'))+1/24
4:每月定时执行
例如:每月1日凌晨1点执行
Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24
5:每季度定时执行
例如每季度的第一天凌晨1点执行
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24
6:每半年定时执行
例如:每年7月1日和1月1日凌晨1点
Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24
7:每年定时执行
例如:每年1月1日凌晨1点执行
Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24
参看
http://blog.163.com/cszhl@126/blog/static/127021334201002643428483/?fromdm&fromSearch&isFromSearchEngine=yes