zoukankan      html  css  js  c++  java
  • 让oracle做定时任务【转】

    今天用oracle的定时任务来实现定时检测。于是goole了一把,在经历了片刻迷茫后,还是实现了。故小作记录,以备忘之:

    1.确保Oracle的工作模式允许启动任务队列管理器 
    Oracle定时执行“Job Queue”的后台程序是SNP进程,而要启动SNP进程,首先要确保整个系统的模式是可以启动SNP进程的,这需要以DBA的身份去执行如下命令: 
    svrmgrl> alter system enable restricted session; 
    或sql> alter system disenable restricted session; 
    利用如上命令更改系统的会话方式为disenable restricted,为SNP的启动创造条件。

    (我在设置该参数的时候,似乎并不能成功,提示“非法的alter system 选项”,于是就没管)

    2.确保Oracle的系统已经配置了任务队列管理器的启动参数 
    SNP的启动参数位于Oracle的初始化文件中,该文件放在$ORACLE_HOME/dbs路径下,如果Oracle的SID是myora8的话,则初始化文件就是initmyora8.ora,在文件中对SNP启动参数的描述部分如下: 
    job_queue_process=n 
    job_queue_interval=N 
    第一行定义SNP进程的启动个数为n。系统缺省值为0,正常定义范围为0~36,根据任务的多少,可以配置不同的数值。 
    第二行定义系统每隔N秒唤醒该进程一次。系统缺省值为60秒,正常范围为1~3600秒。事实上,该进程执行完当前任务后,就进入睡眠状态,睡眠一段时间后,由系统的总控负责将其唤醒。 
    如果该文件中没有上面两行,请按照如上配置添加。配置完成后,需要重新启动数据库,使其生效。注意:如果任务要求执行的间隔很短的话,N的配置也要相应地小一点。 
    (这里所说的正常范围为1~3600秒,我不知道如果我设成1,即24小时)

    3. 将任务加入到数据库的任务队列中 
    调用Oracle的dbms_job包中的存储过程,将任务加入到任务队列中: 
    dbms_job.submit( job out binary_integer, 
    what       in   archar2, 
    next_date     in   date, 
    interval     in   varchar2, 
    no_parse     in   boolean) 
    其中: 
    ●job:输出变量,是此任务在任务队列中的编号; 
    ●what:执行的任务的名称及其输入参数; 
    ●next_date:任务执行的时间; 
    ●interval:任务执行的时间间隔。 
    下面详细讨论一下dbms_job.submit中的参数interval。严格地讲,interval是指上一次执行结束到下一次开始执行的时间间隔,当interval设置为null时,该job执行结束后,就被从队列中删除。假如我们需要该job周期性地执行,则要用‘sysdate+m’表示。  这里的m是以(天)为单位的,即:24小时执行1次,m=1;


    将任务加入到任务队列之前,要确定执行任务的数据库用户,若用户是scott, 则需要确保该用户拥有执行包dbms_job的权限;若没有,需要以DBA的身份将权利授予scott用户: 
    svrmgrl> grant execute on dbms_job to scott; 

    例如:

    SQL> variable n number;
    SQL> begin
      2  dbms_job.submit(:n,'statchangetable;',sysdate,
      3  'sysdate+1/360');
      4  commit;
      5  end;
      6  /


    添加后可以查看一下任务的信息:

    SQL> select job,last_date,last_sec,next_date,next_sec,broken,failures from
      2  dba_jobs;

           JOB LAST_DATE  LAST_SEC         NEXT_DATE  NEXT_SEC         B   FAILURES
    ---------- ---------- ---------------- ---------- ---------------- - ----------
             1 22-8月 -06 16:26:57         22-8月 -06 16:30:57         N         13
             2 22-8月 -06 16:27:17         22-8月 -06 16:31:17         N          5
             3 22-8月 -06 16:27:02         22-8月 -06 16:31:02         N          0

    经过测试,我的换表存储过程终于自动工作了,换表于无形之中...

    不过在查找资料的时候发现有位兄台的遭遇值得记录一下,就是oracle在9.2.0.6版本前,在Solaris平台上有个bug:在运行到497天后会出现计时器溢出,从而导致停止执行任务。

    http://www.blogjava.net/hwpok/archive/2008/03/11/185377.html

  • 相关阅读:
    eclipse中文乱码
    学习进度(7)
    校园管家(Android开发团队项目)NABCD
    NABCD(团队项目)
    android studio连接真机大概问题
    01梦断代码阅读笔记
    学习进度(6)
    android studio学习(一)
    地铁出行系统1.0
    学习进度(4)
  • 原文地址:https://www.cnblogs.com/Godblessyou/p/2160452.html
Copyright © 2011-2022 走看看