重庆思庄Oracle、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 163|回复: 0
打印 上一主题 下一主题

[Oracle] oracle定时任务常用攻略

[复制链接]
跳转到指定楼层
楼主
发表于 4 天前 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在 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)
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', -- 每天零点执行
    enabled         => TRUE,                  -- 启用作业
    comments        => 'Daily execution of PRO_TEST at midnight'
  );
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;
/
5.字典说明
操作  方法
查看作业定义  USER_SCHEDULER_JOBS、DBMS_SCHEDULER.GET_ATTRIBUTE
修改作业属性  DBMS_SCHEDULER.SET_ATTRIBUTE
修改作业逻辑  复制作业(COPY_JOB)或删除后重新创建
查看执行日志  USER_SCHEDULER_JOB_RUN_DETAILS


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2025-4-1 08:28 , Processed in 0.082750 second(s), 20 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表