zoukankan      html  css  js  c++  java
  • oracle: job使用

    oracle的job,实际上就是数据库内置的定时任务,类似代码中的Timer功能。下面是使用过程:

    这里我们模拟一个场景:定时调用存储过程P_TEST_JOB 向表TEST_JOB_LOG中插入数据

    表结构:

    1 create table TEST_JOB_LOG
    2 (
    3   rec_id NUMBER not null,
    4   occr_time DATE
    5 );
    6 alter table TEST_JOB_LOG
    7   add constraint PK_TEST_JOB primary key (REC_ID);

    序列:

    1 create sequence SEQ_TEST_JOB_LOG
    2 minvalue 1
    3 maxvalue 99999999
    4 start with 1
    5 increment by 1
    6 cache 10;

    存储过程:

    1 create or replace procedure P_TEST_JOB is
    2 begin
    3   insert into test_job_log(rec_id, occr_time) values(seq_test_job_log.nextval,sysdate);
    4   commit;
    5 end P_TEST_JOB;

    上面只是准备工作,下面才是重点:(以下脚本全是pl/sql developer环境)

    1、创建job

    1 declare
    2   job_id number;
    3 begin
    4   sys.dbms_job.submit(job_id, 'P_TEST_JOB;', sysdate, 'sysdate+1/1440'); --马上运行,然后每分钟运行一次
    5   sys.dbms_output.put_line(job_id); --输出job Id
    6 end;

    每个job创建后,都会对应一个唯一的数字,在pl/sql的output面板里,可以看到dbms_output.put_line输出的job id值。

    2、查看job运行情况

    1 select * from dba_jobs; --需要dba权限
    2 select * from dba_jobs_running; --需要dba权限
    3 select * from all_jobs;  
    4 select * from user_jobs;

    3、删除job

    begin
      dbms_job.remove(108); --108为具体的job ID,可以通过select * from user_jobs查询得到
    end;

    4、手动启动job

    1 begin
    2   dbms_job.run(109);--运行指定Job
    3 end;

    最后,再给几个关于创建job的小例子:

    a、带参数的存储过程调用

    1 declare
    2   job_id number;
    3 begin
    4   sys.dbms_job.submit(job_id, 'P_JOB_XXX(sysdate-30,sysdate);', sysdate, 'trunc(sysdate+1)+(4*60)/(24*60)'); --每天早上4:00运行
    5   sys.dbms_output.put_line(job_id); --输出job Id
    6 end;

    这里指定了P_JOB_CKG的传入参数为sysdate及sysdate-30,如果是字符串参数,需要加二个单引号,类似 'P_XXX(''参数值'');'

    此外,单引号还可以用CHR(39)来代替,例如:

     1 DECLARE
     2   JOB_ID NUMBER;
     3 BEGIN
     4   SYS.DBMS_JOB.SUBMIT(JOB_ID,
     5                       'P_JOB_XXX(TO_DATE(' || chr(39) ||
     6                       '2014-2-12 00:00:00' || chr(39) || ', ' || chr(39) ||
     7                       'YYYY-MM-DD HH24:MI:SS' || chr(39) || '),TO_DATE(' ||
     8                       chr(39) || '2014-2-12 23:59:59' || chr(39) || ', ' ||
     9                       chr(39) || 'YYYY-MM-DD HH24:MI:SS' || chr(39) ||
    10                       '));',
    11                       TO_DATE('2015-1-6 10:00:00', 'YYYY-MM-DD HH24:MI:SS'),
    12                       'SYSDATE+10/(60*24)'); --2015-01-06 10:00:00 开始执行,每10分钟执行一次
    13   SYS.DBMS_OUTPUT.PUT_LINE(JOB_ID); --输出JOB ID  
    14 END;

    中间那一串恶心的拼接,无非是要得到字符串:

    P_JOB_XXX(TO_DATE('2014-2-12 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),TO_DATE('2014-2-12 23:59:59', 'YYYY-MM-DD HH24:MI:SS'));

    b、关于指定时间的表达式示例

    每天运行一次
        'SYSDATE + 1'

    每小时运行一次
        'SYSDATE + 1/24'

    每10分钟运行一次                 
        'SYSDATE + 10/(60*24)'

    每30秒运行一次                    
        'SYSDATE + 30/(60*24*60)'

    每隔一星期运行一次               
        'SYSDATE + 7'

    每个月最后一天运行一次          
        'TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE,1))) + 23/24'

    每年1月1号零时                    
        'TRUNC(LAST_DAY(TO_DATE(EXTRACT(YEAR FROM SYSDATE)||'12'||'01','YYYY-MM-DD'))+1)'

    每天午夜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)'

    每个月最后一天的23点           
        'TRUNC (LAST_DAY (SYSDATE)) + 23 / 24'

    每个季度最后一天的晚上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)'

  • 相关阅读:
    tzselect
    tzfile
    ttytype
    tty
    TRUNCATE
    true
    troff
    touch
    Open vSwitch
    Web 在线文件管理器学习笔记与总结(5)修改文件内容
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/how-to-use-job-in-oracle.html
Copyright © 2011-2022 走看看