• oracle定时任务的使用


    常见错误:

    PLS-00225: subprogram or cursor 'xxx' reference is out of scope
    # job名字太长
    
    • 1
    • 2
    PLS-00201: identifier 'COUNT_JOB.SUBMIT' must be declared
    # DBMS_JOB.SUBMIT是固定写法
    
    • 1
    • 2

    创建存储过程

    -- 建表
    CREATE TABLE TEST_A(TEST_ADD_DATA DATE);
    -- 存储过程
    CREATE OR REPLACE PROCEDURE TEST_PRO AS
    BEGIN
        INSERT INTO TEST_A VALUES (SYSDATE);
    END;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    创建定时任务JOB

    DECLARE jobno number;    -- UPDATE_COUNT_TIME:给函数定义的工作空间
    BEGIN
        SYS.DBMS_JOB.SUBMIT(
            job => jobno,    -- 调用工作空间
            what => 'TEST_PRO;',    -- 工作空间中执行的函数
            next_date => SYSDATE,    -- 下一次执行的时间,不要改,貌似是这样子,不太确定
            interval => 'TRUNC(LAST_DAY(SYSDATE))+1+1/24');    -- 每月1日凌晨1点执行
    commit;
    End;
    
    或者
    
    DECLARE
        jobno NUMBER;
    BEGIN
        dbms_job.submit(
                jobno, --定时器ID,系统自动获得
                'TEST_PRO;', --what执行的过程名
                 SYSDATE, --next_date,定时器开始执行的时间,这样写表示立即执行
                'TRUNC(sysdate,''mi'') + 1/ (24*60)' --interval,设置定时器执行的频率,这样写每隔1分钟执行一次
            );
        COMMIT;
    END;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    说明:

    1、declare后面的 jobno 是一个数字类型,主要的用途是给定时器保存id,下面的job 引用此 jobno 。

    2、job:输出变量,是此任务在任务队列中的编号;

    3、what:执行的任务的名称及其输入参数;

    4、next_date:任务执行的时间;

    5、interval:任务执行的时间间隔。

    手动执行定时任务

    下面的参数需要根据本地查询的参数来确定

    BEGIN
        DBMS_JOB.RUN(26);
        COMMIT;
    END;
    
    • 1
    • 2
    • 3
    • 4

    停止定时任务

    BEGIN
        DBMS_JOB.BROKEN(26,  TRUE,  SYSDATE);
       COMMIT;
    END;
    
    • 1
    • 2
    • 3
    • 4

    删除定时任务

    BEGIN
        DBMS_JOB.REMOVE(26);
        commit;
    END;
    
    • 1
    • 2
    • 3
    • 4

    注意:26为job的编号,可通过如下语句查询

    -- 查看调度任务
    select * from user_jobs;
    
    -- 查看正在执行的调度任务
    select * from dba_jobs_running;
    
    -- 查看执行完的调度任务
    select * from dba_jobs;
    
    SELECT job,what,log_user,priv_user,broken from dba_jobs 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    常见的Interval 设置

    描述                        INTERVAL参数值 
    每天午夜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) 
    每个季度最后一天的晚上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)
    每秒钟执行次
     
    Interval => sysdate + 1/(24 * 60 * 60)
     
    如果改成sysdate + 10/(24 * 60 * 60)就是10秒钟执行次
     
    每分钟执行 
    Interval => TRUNC(sysdate,'mi') + 1/ (24*60)
     
    如果改成TRUNC(sysdate,'mi') + 10/ (24*60) 就是每10分钟执行次
     
    每天定时执行 
    例如:每天的凌晨1点执行 
    Interval => TRUNC(sysdate) + 1 +1/ (24)
     
    每周定时执行 
    例如:每周一凌晨1点执行 
    Interval => TRUNC(next_day(sysdate,'星期一'))+1/24
     
    每月定时执行 
    例如:每月1日凌晨1点执行 
    Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24
     
    每季度定时执行 
    例如每季度的第一天凌晨1点执行 
    Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24
     
    每半年定时执行 
    例如:每年7月1日和1月1日凌晨1点 
    Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24
     
    每年定时执行 
    例如:每年1月1日凌晨1点执行 
    Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    创建定时器

    1. 创建存储过程或函数,例如:

      CREATE OR REPLACE FUNCTION my_func(
      p_param1 IN VARCHAR2,
      p_param2 IN NUMBER)RETURN NUMBER
      IS  result NUMBER;
      BEGIN  -- do something with parameters 
      result := 1; -- example 
      return value 
      RETURN result;END;
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    2. 创建一个作业,指定要调用的函数和参数,例如

      BEGIN 
      DBMS_SCHEDULER.CREATE_JOB (    
      job_name => 'my_job',    
      job_type => 'STORED_PROCEDURE',   
      job_action => 'my_func',   
      number_of_arguments => 2,   
      start_date => SYSTIMESTAMP,   
      repeat_interval => 'FREQ=DAILY;BYHOUR=8;BYMINUTE=30',    
      auto_drop => FALSE,   
      enabled => TRUE); 
      
      DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE (   
      job_name => 'my_job',   
      argument_position => 1,   
      argument_value => 'param1_value'); 
      
      DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE (   
      job_name => 'my_job', 
      argument_position => 2,    
      argument_value => 123);
      END;
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21

    3、repeat_interval

    -- repeat_interval 支持两种格式
    1. 常规日期格式   
       (1) 每天:sysdate + 1   
    
    2. 日历表达式('FREQ': 频率,'INTERVAL':范围 1-999,可选:BY...)
       FREQ=DAILY; INTERVAL=1 										 每天执行一次 
       FREQ=WEEKLY; INTERVAL=1; BYDAY=MON							 每周一执行一次
       FREQ=WEEKLY; INTERVAL=1; BYDAY=MON,FRI						 每周一,周五执行一次
       FREQ=WEEKLY; INTERVAL=1; BYDAY=MON; BYHOUR=8					 每周一早上8点执行一次
       FREQ=MONTHLY; INTERVAL=1; BYMONTHDAY=1; BYHOUR=8; BYMINUTE=30 每月第一天早上8点30分执行一次
       
       (1) FREQ
    	   YEARLY   年  
    	   MONTHLY  月 
       	   WEEKLY   周 
           DAILY    天		  
           HOURLY   时  
           MINUTELY 分  
           SECONDLY 秒
           
       (2) INTERVAL
           1 ~ 999
    
       (3) BYMONTH
           JAN 一月    -- January
    	   FEB 二月    -- February
    	   MAR 三月    -- March
    	   APR 四月    -- April
    	   MAY 五月    -- May
    	   JUN 六月    -- June
    	   JUL 七月    -- July
    	   AUG 八月    -- August
    	   SEP 九月    -- September
    	   OCT 十月    -- October
    	   NOV 十一月  -- February
    	   DEC 十二月  -- December
           
       (4) BYDAY
    	   MON  周一  -- Monday
    	   TUE  周二  -- Tuesday
    	   WED  周三  -- Wednesday
    	   THU  周四  -- Thursday
    	   FRI  周五  -- Friday
    	   SAT  周六  -- Saturday
    	   SUN  周天  -- Sunday  
    	    
       (5) BYHOUR
       (6) BYMINUTE
       (7) BYSECOND
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    定时器手动执行

    手动执行定时器— job_name 是要运行的作业名称。

    使用以下命令将作业设置为可运行状态:

    EXECUTE DBMS_SCHEDULER.ENABLE('job_name');
    
    • 1

    使用以下命令运行作业:

     EXECUTE DBMS_SCHEDULER.RUN_JOB('job_name');
    
    • 1

    使用以下命令检查作业的状态:

     SELECT job_name, state FROM dba_scheduler_jobs WHERE job_name = 'job_name';
    # 可能的状态包括:SCHEDULED、RUNNING、COMPLETED 和 FAILED
    
    • 1
    • 2

    修改删除

    BEGIN  -- 修改作业  
        DBMS_SCHEDULER.SET_ATTRIBUTE(    
        name => 'my_job',   
        attribute => 'repeat_interval',    
        value => 'FREQ=DAILY;BYHOUR=9;BYMINUTE=0'); 
        -- 删除作业  
        DBMS_SCHEDULER.DROP_JOB('my_job');
    END;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    手动调用函数、存储过程

    当函数中有dml语句的时候,函数调用不能在select和if里面使用,此时需要手动调用函数

     select suc_function(sysdate,'all') from dual;
    -- 执行函数
    DECLARE
    variable_name varchar2(100);
    BEGIN
    variable_name := suc_function(sysdate,'all');
    END;
    
    
    -- 执行存储过程
    call  suc_procedure_data( trunc(sysdate-6),'CPJ')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    https://blog.csdn.net/qq_34745941/article/details/111660478

    https://blog.csdn.net/KevinChen2019/article/details/128256517

  • 相关阅读:
    JS原理-笔记(1/3)
    进程(0)——计算机的中的软硬件【Linux】
    深度学习入门(三十)卷积神经网络——NiN
    公钥加密如何确保数据的完整性
    【Java】网络编程基础—InetAddress类和URL编程
    刷题记录:牛客NC19975[HAOI2008]移动玩具
    【Hack The Box】linux练习-- Doctor
    【Java ee】Servlet的生命周期及线程安全
    提供电商API接口,点击获取API文档及测试
    Go/Golang语言学习实践[回顾]教程13--详解Go语言的词法解析单元
  • 原文地址:https://blog.csdn.net/qq_44779847/article/details/133378429