度量快速开发平台-专业、快速的软件定制快开平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 部件 流程 SQL
查看: 1307|回复: 5
打印 上一主题 下一主题

[分享] oracle定时器job用法小结

[复制链接]

348

主题

3572

帖子

9335

积分

论坛元老

Rank: 8Rank: 8

积分
9335
跳转到指定楼层
楼主
发表于 2020-3-26 21:11:54 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 万望 于 2016-10-26 21:11 编辑

顾名思义,定时器就是定时来完成某些操作,oracle中的定时器job也是这种用法,在oracle中可以通过定义job来定期执行某个程序。oracle提供内置包DBMS_JOB来执行job的相关操作,比如定义、提交、更改、停止、移除等。

1、创建job

使用submit()过程,这个过程中有5个参数:job、what、next_date、interval、no_parse。

  1. procedure submit(
  2. job    out    binary_integer,
  3. what    in    varchar2,
  4. next_date    in    date,
  5. interval    in    varchar2,
  6. no_parse    in    boolean:= FALSE
  7. );
复制代码

job参数是由submit()过程返回的binary_integer,这个值用来唯一标识一个工作;what参数是将被执行的pl/sql代码块;next_date参数指何时将运行这个工作;interval参数指何时这个工作再次被执行,当interval设置为null时,该job执行结束以后,就被从队列中删除;no_parse参数指此工作在提交或执行时是否应进行语法分析,默认值为false,表示笨pl/sql代码应该立即进行语法分析。

下面是一个实例:

  1. DECLARE
  2.   jobno NUMBER;
  3. BEGIN
  4.   dbms_job.submit(job       => jobno,
  5.                   what      => 'OVER_PACK.ADD_DEPT(''EDUCATION'',2710);',
  6.                   next_date => trunc(SYSDATE + 1),
  7.                   INTERVAL  => 'TRUNC(SYSDATE + 1)');
  8.   dbms_output.put_line('job_no = ' || jobno);
  9.   COMMIT;
  10. END;
复制代码

2、查看job

查看相关的job信息,可查询以下对象:dba_jobs、all_jobs、user_jobs、dba_jobs_running(正在运行的job信息)。

3、运行job

运行job通过dbms_job.run()来立即执行一个指定的工作,这个过程只接收一个参数。

  1. BEGIN
  2.     dbms_job.run(jobno); -- jobno就是上面定义过的jobno
  3. END;
复制代码

4、更改job

  1. BEGIN
  2.   DBMS_JOB.CHANGE(1, NULL, TRUNC(SYSDATE + 1) + 6 / 24, 'SYSDATE+4/24');
  3. END;
复制代码

5、删除job

  1. BEGIN
  2.     dbms_job.remove(jobno);
  3. END;
复制代码

定义了job之后,最重要的就是不要忘了用dbms_job.run()来运行job,以前我做的时候,就老是忘了执行。下面是一些常用的interval参数设置的雷子:


描述interval参数值
每天运行一次
sysdate + 1
每小时运行一次
sysdate + 1 / 24
每10分钟运行一次sysdate + 10 / (60 * 24)
每30秒运行一次
sysdate + 30 / (60 * 24 * 60)
每隔一个星期运行一次
sysdate + 7
不再运行该任务并删除它
null
每天午夜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)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复

使用道具 举报

542

主题

5916

帖子

1万

积分

作者

Rank: 7Rank: 7Rank: 7

积分
13589
6#
发表于 2020-3-30 14:05:37 | 只看该作者
学习了
回复

使用道具 举报

328

主题

3738

帖子

8566

积分

作者

Rank: 7Rank: 7Rank: 7

积分
8566
QQ
5#
发表于 2020-3-27 18:46:39 | 只看该作者
回复 支持 反对

使用道具 举报

328

主题

3738

帖子

8566

积分

作者

Rank: 7Rank: 7Rank: 7

积分
8566
QQ
地板
发表于 2020-3-27 18:45:53 | 只看该作者
回复 支持 反对

使用道具 举报

328

主题

3738

帖子

8566

积分

作者

Rank: 7Rank: 7Rank: 7

积分
8566
QQ
板凳
发表于 2020-3-27 18:43:20 | 只看该作者
万望 发表于 2016-10-26 21:11
使用next_day的时候,可能会出现“周中的日期错误”,可以试试看将英文的日期换成中文的,比如“Friday”换 ...

这样所
回复 支持 反对

使用道具 举报

348

主题

3572

帖子

9335

积分

论坛元老

Rank: 8Rank: 8

积分
9335
沙发
 楼主| 发表于 2020-3-26 21:11:55 | 只看该作者
使用next_day的时候,可能会出现“周中的日期错误”,可以试试看将英文的日期换成中文的,比如“Friday”换成“星期五”。

点评

这样所  详情 回复 发表于 2020-3-27 18:43
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|重庆度量科技  本站关键词:快速开发平台

GMT+8, 2024-11-28 14:21 , Processed in 0.180775 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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