【JOB】Oracle中JOB的创建方法以及一个细节的探究
在Oracle中可以使用JOB来实现一些任务的自动化执行,类似于UNIX操作系统crontab命令的功能。
简单演示一下,供参考。
1.创建表T,包含一个X字段,定义为日期类型,方便后面的定时任务测试。
sec@ora10g> create table t (x date);
Table created.
2.创建存储过程p_insert_into_t,每次执行该存储过程都会向T表中插入一条系统当前时间。
sec@ora10g> create or replace procedure
p_insert_into_t
2 as
3
begin
4 insert into t
5
values (SYSDATE);
6 end;
7
/
Procedure created.
3.OK,准备就绪,我们来创建一个JOB,这个JOB会每分钟运行一次?需要注意一个细节!
sec@ora10g> variable job_number number;
sec@ora10g> begin
2
DBMS_JOB.submit (:job_number,
3
'P_INSERT_INTO_T;',
4 SYSDATE,
5 'sysdate+1/(24*60)');
6
end;
7 /
PL/SQL procedure successfully
completed.
4.我们通过USER_JOBS视图查看一下创建的JOB信息。
sec@ora10g> select job,
2 log_user,
3 to_char(last_date,'yyyy-mm-dd
hh24:mi:ss') last_date,
4 to_char(next_date,'yyyy-mm-dd
hh24:mi:ss') next_date,
5 interval,
6 what
7 from user_jobs
8
/
JOB LOG_USER LAST_DATE
NEXT_DATE INTERVAL WHAT
-------
-------- ------------------- ------------------- -----------------
----------------
27 SEC 2010-01-29
00:34:20 sysdate+1/(24*60) P_INSERT_INTO_T;
细节之处在此,此处的LAST_DATE内容是空,表示此JOB没有被执行过,因此这个JOB将永远不会被自动的执行。
这一点可以从T表没有数据来得到验证:
sec@ora10g> select * from t;
no rows selected
那么,如何才能使它自动执行起来呢?
很简单,只要我们手动将这个JOB执行一下即可。
5.手工执行JOB一次,使之按照既定的时间间隔执行。
sec@ora10g> execute dbms_job.run(27);
PL/SQL procedure successfully
completed.
此时T表中将会被插入一条具有当前时间的数据。
sec@ora10g> select * from t;
X
-------------------
2010-01-29 00:37:42
再次查看JOB的信息
sec@ora10g> select job,
2 log_user,
3 to_char(last_date,'yyyy-mm-dd
hh24:mi:ss') last_date,
4 to_char(next_date,'yyyy-mm-dd
hh24:mi:ss') next_date,
5 interval,
6 what
7 from user_jobs
8
/
JOB LOG_USER LAST_DATE
NEXT_DATE INTERVAL WHAT
-------
-------- ------------------- ------------------- -----------------
----------------
27 SEC 2010-01-29 00:37:42 2010-01-29
00:38:42 sysdate+1/(24*60) P_INSERT_INTO_T;
此时LAST_DATE显示了我们执行JOB的时间,同时NEXT_DATE显示了下次JOB将被执行的时间。此后这个JOB将会每隔一分钟被执行一次。
自动执行一段时间后的T表内容如下:
sec@ora10g> select * from t order by x;
X
-------------------
2010-01-29 00:37:42
2010-01-29 00:38:46
2010-01-29 00:39:46
2010-01-29 00:40:46
2010-01-29 00:41:46
2010-01-29 00:42:46
2010-01-29 00:43:46
2010-01-29 00:44:46
2010-01-29 00:45:46
2010-01-29 00:46:46
2010-01-29 00:47:46
2010-01-29 00:48:46
2010-01-29 00:49:46
2010-01-29 00:50:46
2010-01-29 00:51:46
2010-01-29 00:52:46
16 rows selected.
6.为什么刚刚创建后的JOB不能自动的执行呢?
这是一个疏忽导致的!
在创建JOB的时候,需要在结尾处指定“COMMIT;”!表示创建完成之后便执行一次。
删除之前的JOB,重新创建一个带有“COMMIT”语句的新JOB。
sec@ora10g> variable job_number number;
sec@ora10g> begin
2
DBMS_JOB.submit (:job_number,
3
'P_INSERT_INTO_T;',
4 SYSDATE,
5 'sysdate+1/(24*60)');
6
commit;
7 end;
8
/
sec@ora10g> print job_number;
JOB_NUMBER
----------
29
此次创建的JOB信息如下,可见LAST_DATE在创建完之后便有内容,表示已经被执行了一次。
sec@ora10g> select job,
2 log_user,
3 to_char(last_date,'yyyy-mm-dd
hh24:mi:ss') last_date,
4 to_char(next_date,'yyyy-mm-dd
hh24:mi:ss') next_date,
5 interval,
6 what
7 from user_jobs
8
/
JOB LOG_USER LAST_DATE
NEXT_DATE INTERVAL WHAT
-------
-------- ------------------- ------------------- -----------------
----------------
29 SEC 2010-01-29 01:02:11 2010-01-29
01:03:11 sysdate+1/(24*60) P_INSERT_INTO_T;
一分钟过后便可看到T表中已有两条记录。
sec@ora10g> select * from t;
X
-------------------
2010-01-29 01:02:11
2010-01-29 01:03:11
7.删除JOB方法
很简单,使用“dbms_job.remove”即可。
sec@ora10g> execute dbms_job.remove(29);
PL/SQL procedure successfully
completed.
8.最后,谈一下创建JOB时用到的参数。
1)使用desc命令查看DBMS_JOB,可以得到SUBMIT这个存储过程的参数列表。
sec@ora10g> desc DBMS_JOB
...
PROCEDURE SUBMIT
Argument Name
Type In/Out Default?
------------------------------
----------------------- ------ --------
JOB
BINARY_INTEGER OUT
WHAT
VARCHAR2 IN
NEXT_DATE
DATE IN DEFAULT
INTERVAL
VARCHAR2 IN DEFAULT
NO_PARSE
BOOLEAN IN DEFAULT
INSTANCE
BINARY_INTEGER IN DEFAULT
FORCE
BOOLEAN IN DEFAULT
...
2)如果希望对这些参数有更好的理解,可以参考Oracle的官方文档描述,细致而周到。
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_job.htm#sthref2936
3)重点关注一下官方文档中关于INTERVAL参数的示例
'sysdate
+ 7'表示一周执行一次;
'next_day(sysdate,''TUESDAY'')'
表示每周二执行一次;
'null'表示只执行一次。
本文中我使用的是'sysdate+1/(24*60)'表示每分钟执行一次。很形象,一天的二十四分之一是一小时,一小时的六十分之一就是一分钟的意思。
9.小结
通过这个文章和大家分享了一点关于JOB的创建方法和使用,希望对大家有帮助。
细节不容错过!
Good luck.
secooler
10.01.28
-- The End --
【JOB】Oracle中JOB的创建方法以及一个细节的探究的更多相关文章
- Oracle中生成uuid的方法
Oracle中生成uuid的方法 下载LOFTER客户端 在Oracle SQL 提供了一个生成uuid的函数sys_guid: http://download.oracle.com/docs/cd/ ...
- 使用 history 对象和 location 对象中的属性和方法制作一个简易的网页浏览工具
查看本章节 查看作业目录 需求说明: 使用 history 对象和 location 对象中的属性和方法制作一个简易的网页浏览工具 实现思路: 使用history对象中的 forward() 方法和 ...
- Oracle自增列创建方法
最近在做Oracle的项目,由于以前没有接触过Oracle的开发,遇到了不少的问题,比如给Oracle表添加自增列,与SQL Server就不同. Oracle没有自增字段这样的功能,但是通过触发器( ...
- Oracle中的字符处理方法
向左补全字符串 lpad(字段名,填充长度,填充的字符) ,') from dual; 向右补全字符串 rpad(字段名,填充长度,填充的字符) ,') from dual; 返回字符串小写 sele ...
- Oracle中用户的创建和权限设置
权限: CREATE SESSION --允许用户登录数据库权限 CREATE TABLE --允许用户创建表权限 UNLIMITED TABLESPACE --允许用户在其他表空间随意建表 角色: ...
- oracle中的对象创建及删除语句【原创】
oracle对象 1.表 a)创建表1 create table students( id number(10), stuno number(10) , sex varchar2(2), age in ...
- oracle 中的trunc()函数及加一个月,一天,一小时,一分钟,一秒钟方法
返回处理后的数据,不同于round()(对数值进行四舍五入处理),该函数不对指定小数前或后的数值部分进行舍入处理. 语法:trunc(number[,decimals]) 其中,number为待做处理 ...
- Oracle中sequence的使用方法
在Oracle数据库中,sequence等同于序列号,每次取的时候sequence会自动增加,一般会作用于需要按序列号排序的地方. 1.Create Sequence (注释:你需要有CREATE S ...
- Oracle中包的创建
包是过程和函数的集合体,包包括创建包和创建包体,创建包的时候在可以定义过程和函数,包体中则具体实现过程和函数. eg: --创建包 create or replace package mypac1 ...
随机推荐
- day 83 Vue学习四之过滤器、钩子函数、路由、全家桶等
Vue学习四之过滤器.钩子函数.路由.全家桶等 本节目录 一 vue过滤器 二 生命周期的钩子函数 三 vue的全家桶 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 Vue的过滤 ...
- python 安装bs4
1, 下载地址https://www.crummy.com/software/BeautifulSoup/#Download ------------------------------------- ...
- USACO 2003 Fall Orange Cow Exhibition /// 负数01背包 oj22829
题目大意: 输入n 接下来n行 每行输入 a b 输出n行中 a+b总和最大的同时满足 所有a总和>=0所有b总和>=0的值 负数的01背包应该反过来 w[i]为正数时 需要从大往小推 即 ...
- VMware Workstation 10 配置Ubuntu环境
分享到 一键分享 QQ空间 新浪微博 百度云收藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享 VMware Work ...
- spark 应用场景1-求年龄平均值
原文引自:http://blog.csdn.net/fengzhimohan/article/details/78535143 该案例中,我们将假设我们需要统计一个 10 万人口的所有人的平均年龄,当 ...
- JS规则 我与你同在(逻辑与操作符)数学中的“b大于a,b小于c”是“a<b<c”,那么在JavaScript中可以用&&表示
我与你同在(逻辑与操作符) 数学里面的"a>b",在JavaScript中还表示为a>b:数学中的"b大于a,b小于c"是"a<b& ...
- ASP.NET中的DEC加密解密过程
本文章分享自 青青果树园的博客,地址是:http://www.cnblogs.com/qqingmu/archive/2008/01/10/1034168.html 我们做网页时经常会遇到URL传输( ...
- I-country
I-country 在\(n\times m\)的网格图中,给出每个格子的权值,寻找有k个格子的凸联通块,使包含的权值最大,\(N,M≤15,K≤225\). 解 我们首先要知道凸联通块的定义 从任意 ...
- Python-进程(1)
目录 操作系统发展史 穿孔卡片 联机批处理系统 统计批处理系统 单道 多道技术 空间上复用 时间上复用 并行与并发 进程 程序与进程 进程调度 进程的三个状态 就绪态 运行态 阻塞态 同步和异步 阻塞 ...
- HTTP的九种请求方法
HTTP1.0定义了三种请求方法:GET.POST.HEAD HTTP1.1定义了六种请求方法:PUT.DELETE.PATCH.OPTIONS.CONNECT.TRACE 1.get 请求指定页面的 ...