plsql定时执行存储过程之DBMS_JOBS配置

博客介绍了What值填写存储过程名时需加分号,还列举了不同时间间隔的定时执行情况,如每分钟、每天、每周等定时执行示例,最后提到查看jobs、停止job以及停止后再次查看job的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • What值填写存储过程名时后面须加分号

  • 时间间隔
    1:每分钟执行

    Interval => TRUNC(sysdate,'mi') + 1/(24*60)
    

    2:每天定时执行
    例如:每天的凌晨1点执行

    Interval => TRUNC(sysdate) + 1 +1/(24)
    

    3:每周定时执行
    例如:每周一凌晨1点执行

    Interval => TRUNC(next_day(sysdate,'星期一'))+1/24
    

    4:每月定时执行
    例如:每月1日凌晨1点执行

    Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24
    

    5:每季度定时执行
    例如每季度的第一天凌晨1点执行

    Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24
    

    6:每半年定时执行
    例如:每年7月1日和1月1日凌晨1点

    Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24
    

    7:每年定时执行
    例如:每年1月1日凌晨1点执行

    Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'), 12)+1/24
    
  • 查看jobs

    SELECT * FROM dba_jobs;
    

  • 停止job
    在这里插入图片描述
    再次查看job 发现已经停止
    在这里插入图片描述

<think>嗯,用户现在想在Oracle 12c中创建一个定时任务,每天凌晨1点执行存储过程refresh_oa_fa_card_v。他们之前已经得到了关于如何创建存储过程的详细解答,现在需要进一步了解如何用DBMS_SCHEDULER来设置定时任务。 首先,我需要回顾用户提供的引用内容。引用3和4提到了Oracle自带的DBMS函数包,特别是DBMS_SCHEDULER,这可能和创建任务有关。用户的上一个问题中,我也提到了使用DBMS_SCHEDULER来创建定时任务,所以现在需要详细展开这个部分。 用户的需求是每天凌晨1点执行存储过程。我需要确保给出的步骤正确,并且适用于Oracle 12c。可能需要考虑到CDB和PDB的区别,因为在引用2中提到了dba_pdbs,但用户的问题中没有明确说明是否在多租户环境下,所以暂时假设是普通环境。 接下来,我需要解释如何创建作业,设置重复间隔。Oracle的DBMS_SCHEDULER的repeat_interval参数使用FREQ=DAILY;BYHOUR=1;BYMINUTE=0来指定每天1点执行。同时,要确保作业类型正确,这里是PLSQL_BLOCK,因为调用存储过程。 还要注意权限问题,用户可能需要有CREATE JOB权限,或者更高的权限如MANAGE SCHEDULER。可能需要提醒用户检查权限,或者授权相应的权限。 另外,用户之前的问题中提到了存储过程可能涉及权限问题,比如AUTHID CURRENT_USER,所以在定时任务中执行时,要注意执行者的权限是否足够。可能需要建议用户使用DEFINER或CURRENT_USER的权限模型,或者在作业创建时指定credential。 此外,用户可能想知道如何验证任务是否创建成功,如何查看作业运行状态,或者如何修改和删除作业。这部分也需要包含在回答中,比如查询USER_SCHEDULER_JOBS,或者使用DBMS_SCHEDULER.DISABLE和DROP_JOB来管理作业。 还要考虑错误处理,比如如果存储过程执行失败,作业是否会重试,或者如何记录日志。可以建议用户启用日志功能,或者添加错误处理到存储过程中。 最后,需要确保回答结构清晰,步骤明确,代码示例正确,并且包含相关的注意事项和扩展建议,比如如何设置不同的时间间隔,或者如何监控任务执行情况。同时,根据用户之前的回答,可能需要添加相关问题,比如如何修改定时任务的时间,或者如何查看作业日志等。</think>根据Oracle 12c特性及最佳实践,以下是使用DBMS_SCHEDULER创建定时任务的完整实现方案: ### 一、基础版定时任务(推荐) ```sql BEGIN DBMS_SCHEDULER.CREATE_JOB( job_name => 'REFRESH_OA_DAILY_JOB', -- 任务名称 job_type => 'PLSQL_BLOCK', -- 作业类型 job_action => 'BEGIN refresh_oa_fa_card_v(); END;', -- 执行内容 start_date => SYSTIMESTAMP, -- 开始时间 repeat_interval => 'FREQ=DAILY; BYHOUR=1; BYMINUTE=0', -- 每天1点执行[^3] enabled => TRUE, -- 立即启用 comments => '每日凌晨1点刷新oa_fa_card_v表数据' ); END; / ``` ### 二、增强版定时任务(带异常处理) ```sql BEGIN DBMS_SCHEDULER.CREATE_JOB( job_name => 'REFRESH_OA_DAILY_ADV_JOB', job_type => 'STORED_PROCEDURE', -- 直接调用存储过程 job_action => 'refresh_oa_fa_card_v', -- 存储过程名称 number_of_arguments => 0, start_date => TRUNC(SYSDATE) + 1/24, -- 精确到下一个1点 repeat_interval => 'FREQ=DAILY', -- 每天执行 enabled => FALSE, -- 先禁用配置 auto_drop => FALSE, -- 任务完成后保留 comments => '安全版定时刷新任务' ); -- 启用日志记录 DBMS_SCHEDULER.SET_ATTRIBUTE( name => 'REFRESH_OA_DAILY_ADV_JOB', attribute => 'logging_level', value => DBMS_SCHEDULER.LOGGING_FULL ); -- 启用任务 DBMS_SCHEDULER.ENABLE('REFRESH_OA_DAILY_ADV_JOB'); END; / ``` ### 三、关键参数说明 1. **repeat_interval** 详解 ```sql 'FREQ=DAILY; INTERVAL=1; BYHOUR=1; BYMINUTE=0; BYSECOND=0' -- 精确到秒级控制 ``` - 支持ISO 8601标准时间表达式[^4] - 支持复杂规则:`FREQ=MONTHLY; BYMONTHDAY=15,-1`(每月15号和最后一天) 2. **权限要求** ```sql GRANT CREATE JOB TO current_user; -- 基础权限 GRANT EXECUTE ON refresh_oa_fa_card_v TO public; -- 存储过程执行权限 GRANT MANAGE SCHEDULER TO admin_user; -- 高级管理权限 ``` ### 四、任务管理命令 1. 查看任务状态 ```sql SELECT job_name, enabled, last_start_date, next_run_date FROM USER_SCHEDULER_JOBS WHERE job_name = 'REFRESH_OA_DAILY_JOB'; ``` 2. 手动执行测试 ```sql BEGIN DBMS_SCHEDULER.RUN_JOB('REFRESH_OA_DAILY_JOB'); END; ``` 3. 修改执行时间 ```sql BEGIN DBMS_SCHEDULER.SET_ATTRIBUTE( name => 'REFRESH_OA_DAILY_JOB', attribute => 'repeat_interval', value => 'FREQ=DAILY; BYHOUR=2' -- 改为凌晨2点执行 ); END; ``` 4. 禁用/删除任务 ```sql BEGIN DBMS_SCHEDULER.DISABLE('REFRESH_OA_DAILY_JOB'); -- DBMS_SCHEDULER.DROP_JOB('REFRESH_OA_DAILY_JOB'); END; ``` ### 五、多租户环境适配(CDB/PDB) 若在12c多租户架构中运行: ```sql ALTER SESSION SET CONTAINER = pdb_name; -- 切换到目标PDB BEGIN DBMS_SCHEDULER.CREATE_JOB(...); -- 在PDB内创建任务 END; ``` ### 六、最佳实践建议 1. **错误日志监控** ```sql SELECT log_date, job_name, status, error# FROM USER_SCHEDULER_JOB_RUN_DETAILS WHERE job_name = 'REFRESH_OA_DAILY_JOB'; ``` 2. **资源控制** ```sql BEGIN DBMS_SCHEDULER.SET_ATTRIBUTE( name => 'REFRESH_OA_DAILY_JOB', attribute => 'max_run_duration', value => INTERVAL '1800' SECOND -- 限制最大执行时间30分钟 ); END; ``` 3. **依赖关系管理** ```sql BEGIN DBMS_SCHEDULER.ADD_JOB_DEPENDENCY( job_name => 'REFRESH_OA_DAILY_JOB', dependent_name => 'CLEANUP_LOG_JOB' ); END; ``` ### 七、常见问题排查 1. **任务未执行检查** - 确认`SCHEDULER`服务已启动 - 检查`JOB_QUEUE_PROCESSES`参数值 ```sql SHOW PARAMETER job_queue_processes; -- 建议值>10 ``` 2. **权限问题处理** ```sql SELECT * FROM DBA_SYS_PRIVS WHERE grantee = 'CURRENT_USER' AND privilege LIKE '%SCHEDULER%'; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值