Chinaunix首页 | 论坛 | 博客
  • 博客访问: 25833747
  • 博文数量: 271
  • 博客积分: 10025
  • 博客等级: 上将
  • 技术积分: 3358
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-12 15:28
文章分类

全部博文(271)

文章存档

2010年(71)

2009年(164)

2008年(36)

我的朋友

分类: Oracle

2009-08-18 18:16:55

show parameter job_queue_process;

   你可以通过更改这个process数量,来全局的启动或者停止job任务。(需要重启)

    比如你用 :  ALTER SYSTEM SET job_queue_processes = 0;所有Job都将被停止。

 

2. 创建一个job:

通过系统存储过程 dbms_job.submit将job提交到系统任务队列。语法分析如下:

BEGIN
dbms_job.submit(JOB => :jobnumber, — (这是返回值,不需要提供)
WHAT => ‘需要执行的代码‘,
NEXT_DATE => 第一次执行时间,这里有效的时间只有能识别的时间格式。
INTERVAL => 下一次执行时间); -------时间表达式,注意用单引号必须的使用。
commit;
END;
/

 
 3 。举一个例子:

VARIABLE jobnumber number
BEGIN
DBMS_JOB.SUBMIT(JOB => :jobnumber,
WHAT => ‘DBMS_STATS.GATHER_DATABASE_STATS(options => ‘’GATHER AUTO'’);’,  -------特别需要注意最后一个分号不能少。
NEXT_DATE => to_date(’11:30 01/23/06′,’HH24:MI MM/DD/YY’),
INTERVAL => ‘SYSDATE + 1′);
COMMIT;
END;
/
print jobnumber

4 。关于INTERVAL说明:
这个参数说明的是我们希望多久运行一次这个job.它是一个时间字符串,它在每次运行后都将被
重新计算,即或得下一次运行时间。比如:
SYSDATE+.5,表示12小时候再次运行。SYSDATE+7表示一周后运行,从而也就实现了没周周运行一次的效果。
如果用null代替具体时间,这个任务将只被运行一次,然后自动从Job队列中删除。

5. 启动一个Job任务:
BEGIN
DBMS_JOB.RUN(JOB => 21);  -----其中21是任务号。
END;
/

6. 查看job queue:
有四种视图可以查看这个队列情况:
DBA_JOBS 列出数据库中所有job队列。

ALL_JOBS 信息基本和DBA_JOBS,有点点区别(has the same information as DBA_JOBS but only on jobs which are accessible tot he current user);

USER_JOBS 只列出当前用户所具有的job信息;

DBA_JOBS_RUNNING 这个可以获取当前在运行的job信息。

7. job失败的处理:
   job失败的原因很多,但一般都是权限问题;
   当job失败的时候,在Oracle alert log中将会留有信息,错误代码是ORA-12012;
   当oracle尝试启动一个job 16次以后还未成功,则放弃尝试,同时将dba_jobs这个视图中broken标记为"Y".
   所以,如果你不想一个任务被调用,可以这样:
   BEGIN
    DBMS_JOB.BROKEN(JOB => 21, BROKEN => TRUE); ----------标记为TRUE;
  END;

8.改变一个job;
  1)你当然可以删除这个job;然后重新写一个;
  2)更好的方式是通过DBMS_JOB_CHANGE()这个方法。关于这个的几个说明:
    使用方式如下:
    BEGIN
     DBMS_JOB.CHANGE(JOB => 21, WHAT => NULL, NEXT_DATE => NULL, INTERVAL => ‘SYSDATE + 7′);
    END;
    /
    注意,你如果不想改变说明,就标记它为NULL.比如上面这个,只是想改变INTERVAL,那么就把的都标记为NULL.

9,移除一个Job
   begin
    DBMS_JOB.REMOVE(JOB => 21);
   end;

10。补充,job中用到的时间描述:
    oracle时间精确到秒;如果你不希望如此精确,你可以使用TRUNC方法,然后加上特定的时间来表示。比如:
    SELECT to_char(trunc(sysdate) + 14/24, 'MM/DD/YYYY HH:MI AM') FROM dual;
    TRUNC将时间截断到午夜12点整。12:00 AM;这样再加上14个小时,从而或得结果为2:00 pm.

    trunc(sysdate + n)表示将日子往后移n天的午夜12点。
阅读(679) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~