Oracle 19c 中,若想创建个定时任务,可以通过 DBMS_SCHEDULER 、实战

发布于:2025-08-13 ⋅ 阅读:(34) ⋅ 点赞:(0)

最近的项目中用到定时任务,做了个小小笔记,分享给大家。

在 Oracle 19c 中,若想创建个定时任务,可以通过 DBMS_SCHEDULER 或 DBMS_JOB 来创建定时任务,确保存储过程 pro_test 每天零点自动执行一次。

1. 创建作业
1.1.授权说明
-- 授权创建JOB权限
GRANT CREATE JOB TO <USER>

-- 若要存储过程属于其他用户,需要授权
GRANT EXECUTE ON PRO_TEST TO <USER>;

1.2.创建作业(Job)

1.2.1
BEGIN
  DBMS_SCHEDULER.CREATE_JOB (
    job_name        => 'JOB_PRO_TEST_DAILY',  -- 作业名称
    job_type        => 'STORED_PROCEDURE',    -- 作业类型(存储过程)
    job_action      => 'PRO_TEST',            -- 存储过程名
    start_date      => SYSTIMESTAMP,          -- 开始时间(立即生效)
    repeat_interval => 'FREQ=DAILY; BYHOUR=0; BYMINUTE=0; BYSECOND=0', -- 每天零点执行
    end_date        => to_date(null),
    job_class       => 'DEFAULT_JOB_CLASS',
    enabled         => TRUE,-- 启用作业
    auto_drop       => false,--是否定时任务停掉不要了就自动删除改定时任务
    comments        => 'Daily execution of PRO_TEST at midnight'
  );
END;

1.2.2
begin
  sys.dbms_scheduler.create_job(job_name            => 'JOB_SYNC_BA_BGT_INFO_V25',
                                job_type            => 'STORED_PROCEDURE',
                                job_action          => 'SYNC_BA_BGT_INFO_V25',
                                start_date          => sysdate,
                                repeat_interval     => 'Freq=MINUTELY;INTERVAL=1',  --每分钟执行一次
                                end_date            => sysdate+3/1440,--3分钟后停止执行
                                job_class           => 'DEFAULT_JOB_CLASS',
                                enabled             => true,
                                auto_drop           => false,--是否定时任务停掉不要了就自动删除改定时任务
                                comments            => '同步指标信息表');
end;

关键参数说明

repeat_interval:
FREQ=DAILY:每天执行。
BYHOUR=0:在 0 点执行。
BYMINUTE=0 和 BYSECOND=0:精确到 00:00:00。

1.3.手动执行进行测试
BEGIN
  DBMS_SCHEDULER.RUN_JOB('JOB_PRO_TEST_DAILY');
END;

2.查看 DBMS_SCHEDULER 作业的详细信息

2.1 查询 *_SCHEDULER_JOBS 视图
-- 查看当前用户下的作业
SELECT job_name, job_type, job_action, start_date, repeat_interval, enabled, state
FROM USER_SCHEDULER_JOBS;

-- 查看所有作业(需 DBA 权限)
SELECT job_name, owner, job_type, job_action, start_date, repeat_interval, enabled, state
FROM DBA_SCHEDULER_JOBS;

2.2 查询 *_SCHEDULER_PROGRAMS(如果作业关联了程序)
SELECT program_name, program_type, program_action
FROM USER_SCHEDULER_PROGRAMS;

2.3 查询 *_SCHEDULER_JOB_ARGS(查看作业参数)
SELECT job_name, argument_name, argument_value
FROM USER_SCHEDULER_JOB_ARGS
WHERE job_name = 'JOB_PRO_TEST_DAILY';

2.4 使用 DBMS_SCHEDULER.GET_ATTRIBUTE 获取作业属性
DECLARE
  v_repeat_interval VARCHAR2(1000);
BEGIN
  DBMS_SCHEDULER.GET_ATTRIBUTE(
    name      => 'JOB_PRO_TEST_DAILY',
    attribute => 'repeat_interval',
    value     => v_repeat_interval
  );
  DBMS_OUTPUT.PUT_LINE('Repeat Interval: ' || v_repeat_interval);
END;

3.查看作业运行状况
-- 查看作业运行历史
SELECT job_name, status, log_date, run_duration
FROM USER_SCHEDULER_JOB_RUN_DETAILS
WHERE job_name = 'JOB_PRO_TEST_DAILY';

-- 查看作业错误日志
SELECT job_name, status, error#, error_msg
FROM USER_SCHEDULER_JOB_RUN_DETAILS
WHERE status = 'FAILED';

4. 修改 DBMS_SCHEDULER 作业(如需)

4.1 使用 DBMS_SCHEDULER.SET_ATTRIBUTE 修改作业属性
-- 修改作业的执行时间(每天 1:00 执行)
BEGIN
  DBMS_SCHEDULER.SET_ATTRIBUTE(
    name      => 'JOB_PRO_TEST_DAILY',
    attribute => 'repeat_interval',
    value     => 'FREQ=DAILY; BYHOUR=1; BYMINUTE=0; BYSECOND=0'
  );
END;

-- 修改作业的存储过程(job_action)
BEGIN
  DBMS_SCHEDULER.SET_ATTRIBUTE(
    name      => 'JOB_PRO_TEST_DAILY',
    attribute => 'job_action',
    value     => 'pro_test_v2'  -- 新的存储过程名
  );
END;

-- 修改作业的启用状态
BEGIN
  -- DBMS_SCHEDULER.ENABLE('JOB_PRO_TEST_DAILY');  -- 启用
  -- DBMS_SCHEDULER.DISABLE('JOB_PRO_TEST_DAILY'); -- 禁用
END;

4.2 使用 DBMS_SCHEDULER.COPY_JOB 复制并修改作业
-- 复制作业并修改
BEGIN
  DBMS_SCHEDULER.COPY_JOB(
    source_job      => 'JOB_PRO_TEST_DAILY',
    destination_job => 'JOB_PRO_TEST_DAILY_V2'
  );
  DBMS_SCHEDULER.SET_ATTRIBUTE(
    name      => 'JOB_PRO_TEST_DAILY_V2',
    attribute => 'job_action',
    value     => 'pro_test_v2'
  );
END;

4.3 删除并重新创建作业
-- 删除作业
BEGIN
  -- DBMS_SCHEDULER.DROP_JOB('JOB_PRO_TEST_DAILY');
END;

-- 重新创建作业
BEGIN
  DBMS_SCHEDULER.CREATE_JOB (
    job_name        => 'JOB_PRO_TEST_DAILY',
    job_type        => 'STORED_PROCEDURE',
    job_action      => 'pro_test_v2',
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'FREQ=DAILY; BYHOUR=0; BYMINUTE=0; BYSECOND=0',
    enabled         => TRUE
  );
END;


4.4 查看定时任务上一次开始时间
select JOB_NAME, LAST_START_DATE from USER_SCHEDULER_JOBS b 
 where JOB_NAME='JOB_SYNC_BA_TR_BGT_INFO_V25';

5.字典说明
操作    方法
查看作业定义    USER_SCHEDULER_JOBS、DBMS_SCHEDULER.GET_ATTRIBUTE
修改作业属性    DBMS_SCHEDULER.SET_ATTRIBUTE
修改作业逻辑    复制作业(COPY_JOB)或删除后重新创建
查看执行日志    USER_SCHEDULER_JOB_RUN_DETAILS


网站公告

今日签到

点亮在社区的每一天
去签到