Jun 22

Oracle 创建job快速入门,用户如何执行其他用户的job

admin , 22:54 , 数据库 » 数据库(Oracle开发) , 评论(0) , 引用(0) , 阅读(5429) , Via 本站原创 | |
搜索
我已经获得阿里云幸运券,准备分享给您。请点击获取  

实现的功能:每隔一分钟自动向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