2020-07-29 21:18:22
在Oracle数据库中设置每小时执行一次的定时任务,可以通过DBMS_SCHEDULER包实现(推荐方式,比DBMS_JOB更灵活)。以下是详细步骤和示例代码:
1. 登录Oracle数据库使用具有创建作业权限的账户(如SYS或自定义管理员账户)登录:
sqlplus username/password@database2. 创建存储过程(任务逻辑)定义需要每小时执行的任务逻辑(例如调用存储过程或匿名块):
CREATE OR REPLACE PROCEDURE hourly_task_proc ASBEGIN -- 任务逻辑(示例:插入日志) INSERT INTO scheduler_logs (task_name, execution_time) VALUES ('HOURLY_JOB', SYSTIMESTAMP); COMMIT; DBMS_OUTPUT.PUT_LINE('任务执行成功: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS'));EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('错误: ' || SQLERRM);END hourly_task_proc;/3. 创建定时任务(Schedule)使用DBMS_SCHEDULER.CREATE_SCHEDULE定义每小时重复的调度:
BEGIN DBMS_SCHEDULER.CREATE_SCHEDULE( schedule_name => 'HOURLY_SCHEDULE', start_date => SYSTIMESTAMP, repeat_interval => 'FREQ=HOURLY; INTERVAL=1', -- 每小时一次 comments => '每小时执行的调度' );END;/4. 创建作业(Job)并绑定调度通过DBMS_SCHEDULER.CREATE_JOB创建作业,关联到上述调度和存储过程:
BEGIN DBMS_SCHEDULER.CREATE_JOB( job_name => 'HOURLY_JOB', job_type => 'STORED_PROCEDURE', job_action => 'hourly_task_proc', -- 存储过程名 schedule_name => 'HOURLY_SCHEDULE', -- 关联调度 enabled => FALSE, -- 先禁用,创建后手动启用 auto_drop => FALSE, -- 作业完成后保留 comments => '每小时执行的任务' );END;/5. 启用作业BEGIN DBMS_SCHEDULER.ENABLE('HOURLY_JOB');END;/6. 验证作业状态检查作业是否成功创建并运行:
-- 查看作业状态SELECT job_name, enabled, state, last_start_date, next_run_dateFROM user_scheduler_jobsWHERE job_name = 'HOURLY_JOB';-- 查看作业运行日志(需提前创建日志表)SELECT * FROM scheduler_logs ORDER BY execution_time DESC;关键注意事项若使用较旧Oracle版本,可用DBMS_JOB(但已不推荐):
DECLARE jobno NUMBER;BEGIN DBMS_JOB.SUBMIT( job => jobno, what => 'hourly_task_proc;', -- 存储过程调用 next_date => SYSDATE, interval => 'SYSDATE + 1/24' -- 每小时(1/24天) ); COMMIT; DBMS_OUTPUT.PUT_LINE('作业ID: ' || jobno);END;/通过以上步骤,即可在Oracle中稳定实现每小时自动执行的任务。如需调整频率(如每30分钟),修改repeat_interval为FREQ=MINUTELY; INTERVAL=30即可。