Oracle Job 任务计划管理[作业,定期执行任务]

转自: http://zjd9961.blog.163.com/blog/static/338929902009811113023415/


常用命令:

SQL>select   *   from   v$parameter where name='job_queue_processes';   --查阅作业的进程号

SQL> select * from dba_jobs;--数据库所有的任务

SQL> select * from USER_JOBS;--数据库当前用户的所有任务

SQL>  select job,what,to_char(last_date,'yyyy-mm-dd HH24:mi:ss'),

           to_char(next_date,'yyyy-mm-dd HH24:mm'),interval from dba_jobs;--查看所有的任务信息

SQL>select job,what,last_date,next_date,interval from   dba_jobs ;--查看所有的任务信息

SQL> exec dbms_job.broken(1,true);--停止一个job

SQL> commit ;---必须提交否则停止无效
SQL> exec dbms_job.broken(1,false);--启动作业

SQL>exec sys.dbms_ijob.broken(98,true);--停其他用户的job

SQL> commit ;---必须提交否则停止无效

 

示例如下:

exec dbms_job.broken(:job) 停止
exec dbms_job.broken(186,true) //标记位broken
exec dbms_job.broken(186,false)//标记为非broken
exec dbms_job.broken(186,false,next_day(sysdate,'monday')) //标记为非broken,指定执行时间
exec dbms_job.remove(:job);删除
exec dbms_job.remove(186);
commit;

相关视图:
dba_jobs
all_jobs
user_jobs
dba_jobs_running 包含正在运行job相关信息

 

job change//修改作业
execute dbms_job.change(186,null,null,'sysdate+3');
execute dbms_job.change(186,'scott.test(update)');

 

DBA_JOBS
===========================================
字段(列)           类型                  描述
JOB                 NUMBER           任务的唯一标示号
LOG_USER            VARCHAR2(30)     提交任务的用户
PRIV_USER           VARCHAR2(30)     赋予任务权限的用户
SCHEMA_USER         VARCHAR2(30)     对任务作语法分析的用户模式
LAST_DATE           DATE             最后一次成功运行任务的时间
LAST_SEC            VARCHAR2(8)      如HH24:MM:SS格式的last_date日期的小时,分钟和秒
THIS_DATE      DATE             正在运行任务的开始时间,如果没有运行任务则为null
THIS_SEC      VARCHAR2(8)      如HH24:MM:SS格式的this_date日期的小时,分钟和秒
NEXT_DATE           DATE             下一次定时运行任务的时间
NEXT_SEC            VARCHAR2(8)      如HH24:MM:SS格式的next_date日期的小时,分钟和秒
TOTAL_TIME          NUMBER           该任务运行所需要的总时间,单位为秒
BROKEN              VARCHAR2(1)      标志参数,Y标示任务中断,以后不会运行
INTERVAL            VARCHAR2(200)    用于计算下一运行时间的表达式
FAILURES     NUMBER      任务运行连续没有成功的次数
WHAT                VARCHAR2(2000)   执行任务的PL/SQL块
CURRENT_SESSION_LABEL RAW           MLSLABEL 该任务的信任Oracle会话符
CLEARANCE_HI       RAW MLSLABEL      该任务可信任的Oracle最大间隙
CLEARANCE_LO       RAW               MLSLABEL 该任务可信任的Oracle最小间隙
NLS_ENV            VARCHAR2(2000)    任务运行的NLS会话设置
MISC_ENV           RAW(32)           任务运行的其他一些会话参数


描述                     INTERVAL参数值
每天午夜12点             'TRUNC(SYSDATE + 1)'
每天早上8点30分          'TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)'
每星期二中午12点          'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24'
每个月第一天的午夜12点     'TRUNC(LAST_DAY(SYSDATE ) + 1)'
每个季度最后一天的晚上11点 'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24'
每星期六和日早上6点10分     'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)'

 

一个简单例子:    
   
  创建测试表  
  SQL>   create   table   a(a   date);  
   
  表已创建。  
   
  创建一个自定义过程  
  SQL>   create   or   replace   procedure   test (  p_init_date IN number)   as  
      2     begin  
      3     insert   into   a   values(to_date(p_init_date,'yyyy-mm-dd'));  
      4     end;  
      5     /  
   
  过程已创建。  
   
  创建JOB  
  SQL>   variable   job1   number;   
  SQL>   begin   --每天1440分钟,即一分钟运行test过程一次   
      2     dbms_job.submit(:job1,'test(20090101);',sysdate,'sysdate+1/1440' );

     3     end;  
      4     /  
   
  PL/SQL   过程已成功完成。  

job1
---------
41

    
  运行JOB  
  SQL>   begin  
      2     dbms_job.run(:job1);   ---或者dbms_job.run(41);  编号41是上面job1的任务号
      3     end;  
      4     /  
   
  PL/SQL   过程已成功完成。  
   
  SQL>   select   to_char(a,'yyyy/mm/dd   hh24:mi:ss')   时间   from   a;  
   
  时间  
  -------------------  
  2009/01/01   00:00:00   
  2009/01/01   00:00:00  
  2009/01/01   00:00:00  
    
  删除JOB  
  SQL>   begin  
      2     dbms_job.remove(:job1);     ---或者dbms_job.remove(41);  编号41是上面job1的任务号
      3     end;  
      4     /  
   
  PL/SQL   过程已成功完成。  

job1
---------
41

    
    
  select   job,to_char(next_date,'yyyy-mm-dd   hh24:mi:ss')   from   all_jobs;  
   
   

 

--以下任务是13:30以后开始执行一下个任务计划,并且每十分钟执行一次(注意这里任务计划是启动时就执行一次,所以13:26启动执行后,到13:36分执行第二次)
   variable   move_data   number;  
   begin  
       dbms_job.submit(:move_data,'SP_DGZQ_AUTO_MOVE_DATA(1);',sysdate+(13*60+30)/(24*60),'SYSDATE + 10/(24*60)');
    end;  
   /
  ----------job的使用:  
   
  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);  
  例子:  
  VARIABLE   jobno   number;  
  begin  
              DBMS_JOB.SUBMIT(:jobno,    
                              'Procdemo;',//Procdemo为过程名称    
                                SYSDATE,   'SYSDATE   +   1/720');  
                    commit;  
  end;  
   
  -----修改job_queue_processes的值(保证其不为0否则JOB不自动运行)  
  可通过select   *   from   v$parameter;查看其值;  
  方法1,startup   pfile='C:\oracle\ora90\database\initorcl.ora';  
  需要修改initorcl.ora文件的job_queue_processes参数,然后重新启动数据库以后才能生效  
  方法2,alter   system   set   job_queue_processes=10    
  不需要重新启动数据库就能生效,系统自动修改init.ora文件




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值