Oracle中JOB的创建后不执行解决方法

Posted on

Oracle中JOB的创建后不执行解决方法

leegstar的个人空间

copy Bookmark http://space.itpub.net/26585184

空间管理 您的位置: ITPUB个人空间 » leegstar的个人空间 » 日志

Oracle中JOB的创建后不执行解决方法

上一篇 / 下一篇 2013-08-07 15:13:48 / 个人分类:oracle 查看( 174 ) / 评论( 1 ) / 评分( 5 / 0 )

**[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 --

http://space.itpub.net/519536/viewspace-626310/

全部脚印 不留脚印 留下脚印:

  • 51317曾经在2013-8-13访问过该主题

51317

  • baojh曾经在2013-8-13访问过该主题

baojh

  • 淡定的DBA曾经在2013-8-13访问过该主题

淡定的DBA

  • 29112063曾经在2013-8-12访问过该主题

29112063

  • hwayw曾经在2013-8-09访问过该主题

hwayw

  • yhj20041128001曾经在2013-8-08访问过该主题

yhj20041128001

  • 29036651曾经在2013-8-08访问过该主题

29036651

  • ITPUB博客管理员曾经在2013-8-08访问过该主题

ITPUB博客管理员

导入论坛 引用链接 收藏 分享给好友 推荐到圈子 管理 举报

TAG: 引用 删除 Guest / 2013-08-08 14:56:40 评 5 分

查看全部评论

-5 -3 -1 - +1 +3 +5

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

内容

昵称

验证 seccode

提交评论

leegstar

leegstar

用户菜单

标题搜索

日历

« 2013-08-13 日 一 二 三 四 五 六 12345678910111213141516171819202122232425262728293031

我的存档

RSS订阅

  • RSS订阅

清空Cookie - 联系我们 - ITPUB个人空间 - 交流论坛 - 空间列表 - 站点存档 - 升级自己的空间

Powered by X-Space 3.0.2 © 2001-2007 Comsenz Inc. 京ICP证:010037号网站统计 我要啦免费统计 Open Toolbar

希望本站内容对您有点用处,有什么疑问或建议请在后面留言评论
转载请注明作者(RobinChia)和出处 It so life ,请勿用于任何商业用途