oracle定时任务的使用

常见错误:

复制代码
PLS-00225: subprogram or cursor 'xxx' reference is out of scope
# job名字太长

PLS-00201: identifier 'COUNT_JOB.SUBMIT' must be declared
# DBMS_JOB.SUBMIT是固定写法

创建存储过程

复制代码
-- 建表
CREATE TABLE TEST_A(TEST_ADD_DATA DATE);
-- 存储过程
CREATE OR REPLACE PROCEDURE TEST_PRO AS
BEGIN
    INSERT INTO TEST_A VALUES (SYSDATE);
END;

创建定时任务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、declare后面的 jobno 是一个数字类型,主要的用途是给定时器保存id,下面的job 引用此 jobno 。

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

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

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

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

手动执行定时任务

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

sql 复制代码
BEGIN
    DBMS_JOB.RUN(26);
    COMMIT;
END;

停止定时任务

复制代码
BEGIN
    DBMS_JOB.BROKEN(26,  TRUE,  SYSDATE);
   COMMIT;
END;

删除定时任务

复制代码
BEGIN
    DBMS_JOB.REMOVE(26);
    commit;
END;

注意: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 

常见的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. 创建存储过程或函数,例如:

    复制代码
    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;
  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;

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

定时器手动执行

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

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

复制代码
EXECUTE DBMS_SCHEDULER.ENABLE('job_name');

使用以下命令运行作业:

复制代码
 EXECUTE DBMS_SCHEDULER.RUN_JOB('job_name');

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

复制代码
 SELECT job_name, state FROM dba_scheduler_jobs WHERE job_name = 'job_name';
# 可能的状态包括:SCHEDULED、RUNNING、COMPLETED 和 FAILED

修改删除

复制代码
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;

手动调用函数、存储过程

当函数中有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')

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

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

相关推荐
NineData7 分钟前
NineData数据库DevOps功能全面支持百度智能云向量数据库 VectorDB
数据库·人工智能·mysql
TDengine (老段)34 分钟前
TDengine 开发指南—— UDF函数
java·大数据·数据库·物联网·数据分析·tdengine·涛思数据
Waloo1 小时前
STUFF 函数
数据库·sql server
?ccc?2 小时前
MySQL故障排查与生产环境优化
数据库·mysql
零叹2 小时前
篇章二 论坛系统——系统设计
数据库·数据库设计·技术选型·表的设计
重生之后端学习2 小时前
苍穹外卖-day03
java·开发语言·数据库·spring boot·mysql·spring·tomcat
快起来别睡了2 小时前
传统数据表创建与Prompt方式的对比:以NBA赛季投篮数据表设计为例
数据库·程序员
五月高高2 小时前
Oracle查询表空间大小
oracle
远方16092 小时前
21-Oracle 23 ai-Automatic SQL Plan Management(SPM)
数据库·sql·oracle
语风方伯2 小时前
Mysql docker部署8.0升级到8.4
数据库