设为首页 收藏本站
查看: 2603|回复: 0

[经验分享] oracle 定时循环执行sql语句--使用dbms_job包

[复制链接]

尚未签到

发表于 2018-10-20 06:59:26 | 显示全部楼层 |阅读模式
  一、dbms_job涉及到的知识点
  1、创建job:
  variable jobno number;
  dbms_job.submit(:jobno, —-job号
  'your_procedure;',—-执行的存储过程, ';'不能省略
  next_date, —-下次执行时间
  'interval' —-每次间隔时间,interval以天为单位
  );
  –系统会自动分配一个任务号jobno。
  2、删除job: dbms_job.remove(jobno);
  3、修改要执行的操作: job:dbms_job.what(jobno, what);
  4、修改下次执行时间:dbms_job.next_date(jobno, next_date);
  5、修改间隔时间:dbms_job.interval(jobno, interval);
  6、启动job: dbms_job.run(jobno);
  7、停止job: dbms.broken(jobno, broken, nextdate); –broken为boolean值
  二、初始化相关参数job_queue_processes
  1、job_queue_process表示oracle能够并发的job的数量,当job_queue_process值为0时表示全部停止oracle的job。
  2、查看job_queue_processes参数
  方法一:
  show parameter job_queue_process;
  方法二:
  select * from v$parameter where name='job_queue_processes';
  3、修改job_queue_processes参数
  alter system set job_queue_processes = 10;
  三、user_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            下一次定时运行任务的时间
  以下使用一个案例来演示dbms_job的使用
  一、在plsql中创建表:
  1
  2
  3
  4
  create table t(
    id   varchar2(30),
    name varchar2(30)
  );
  二、在plsql中创建存储过程:
  1
  2
  3
  4
  5
  6
  create or replace procedure proce_t is
  begin
     insert into t(id, name) values('1', to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'));
     commit;
  end proce_t;
  /
  三、创建job任务(1分钟执行一次):
  在sql>后执行:
  1
  2
  3
  4
  5
  6
  variable jobno number;
  begin
     dbms_job.submit(:jobno,'proce_t;', sysdate, 'sysdate+1/24/60');
     commit;
  end;
  /
  提交后提示:
  1
  2
  3
  4
  pl/sql procedure successfully completed
  jobno
  ---------
  25
  四、跟踪任务的情况(查看任务队列):
  1
  2
  3
  4
  5
  sql> select job, next_date, next_sec, failures, broken from user_jobs;
  
         job next_date   next_sec           failures broken
  ---------- ----------- ---------------- ---------- ------
          25 2012/9/14 1 10:59:46                  0 n
  说明任务已创建成功。
  执行select * from t;查看定时任务的结果。可以看出定时任务是正常执行了的。
  五、停止定时任务
  1、查看定时任务的job号。
  1
  2
  3
  4
  5
  sql> select job, next_date, next_sec, failures, broken from user_jobs;
  
         job next_date   next_sec           failures broken
  ---------- ----------- ---------------- ---------- ------
          25 2012/9/14 1 11:01:48                  0 n
  2、停止一个已启动的定时任务:
  1
  2
  3
  4
  5
  begin
     dbms_job.broken(25, true, sysdate);
     commit;
  end;
  /
  表示停止job为25的任务。
  执行后显示如下:
  pl/sql procedure successfully completed
  3、查看定时任务是否已停止成功
  1
  2
  3
  4
  5
  sql> select job, next_date, next_sec, failures, broken from user_jobs;
  
         job next_date   next_sec           failures broken
  ---------- ----------- ---------------- ---------- ------
          25 4000/1/1    00:00:00                  0 y
  broken值为y,表示定时任务已停止。
  六、启动定时任务
  1、查看停止定时任务
  1
  2
  3
  4
  5
  sql> select job, next_date, next_sec, failures, broken from user_jobs;
  
         job next_date   next_sec           failures broken
  ---------- ----------- ---------------- ---------- ------
          25 4000/1/1    00:00:00                  0 y
  broken值为y,表示定时任务已停止。
  2、启动定时任务
  1
  2
  3
  4
  5
  begin
     dbms_job.run(25);
     commit;
  end;
  /
  3、查看定时任务是否已启动
  1
  2
  3
  4
  5
  sql> select job, next_date, next_sec, failures, broken from user_jobs;
  
         job next_date   next_sec           failures broken
  ---------- ----------- ---------------- ---------- ------
          25 2012/9/14 1 11:06:17                  0 n
  broken值为n,表示定时任务启动成功。
  七、查看进程数
  show parameter job_queue_processes;
  必须大于0,否则执行下面的命令修改:
  alter system set job_queue_processes=10;
  八、再创建一个任务(每5分钟执行一次):
  1
  2
  3
  4
  5
  6
  variable jobno number;
  begin
     dbms_job.submit(:jobno, 'proce_t;', sysdate, 'sysdate+1/24/12'); --interval是以天为单位的
     commit;
  end;
  /
  、 执行select job,next_date,next_sec,failures,broken from user_jobs;
  结果:
  1
  2
  3
  4
  5
  6
  sql> select job,next_date,next_sec,failures,broken from user_jobs;
  
         job next_date   next_sec           failures broken
  ---------- ----------- ---------------- ---------- ------
          26 2012/9/14 1 11:12:08                  0 n
          25 2012/9/14 1 11:07:18                  0 n
  十、总结
  关于job运行时间
  1:每分钟执行
  Interval => TRUNC(sysdate,'mi') + 1/(24*60)
  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
  job的运行频率设置
  1.每天固定时间运行,比如早上8:10分钟:Trunc(Sysdate+1) + (8*60+10)/24*60
  2.Toad中提供的:
  每天:trunc(sysdate+1)
  每周:trunc(sysdate+7)
  每月:trunc(sysdate+30)
  每个星期日:next_day(trunc(sysdate),'星期日')
  每天6点:trunc(sysdate+1)+6/24
  半个小时:sysdate+30/(24*60)
  3.每个小时的第15分钟运行,比如:8:15,9:15,10:15…:trunc(sysdate,'hh')+(60+15)/(24*60)。
  此文为转载原文地址:http://blog.itpub.net/23055736/viewspace-1115938/
  仅供个人参考


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-623796-1-1.html 上篇帖子: 明细表批量新增,修改,删除sql-JianBo 下篇帖子: SQL注入之mysql显错注入
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表