创建计划任务的基本步骤:首先登录SQL*Plus,使用sys用户,执行以下命令:BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name => 'MY_JOB', job_type => 'PLSQL_BLOCK', job_action => 'BEGIN INSERT INTO test VALUES (SYSDATE); END;', start_date => SYSTIMESTAMP, repeat_interval => 'FREQ=MINUTELY;INTERVAL=1', enabled => TRUE); END; / 这就是一个简单的每分钟执行插入当前时间的任务。
查看任务状态
查询所有任务:SELECT job_name, state, next_run_date FROM user_jobs; 查询调度器任务:SELECT job_name, state, enabled FROM dba_scheduler_jobs; 任务历史:SELECT job_name, log_date, status FROM dba_scheduler_job_run_details ORDER BY log_date DESC;
启用禁用任务
EXEC DBMS_SCHEDULER.ENABLE('MY_JOB'); EXEC DBMS_SCHEDULER.DISABLE('MY_JOB'); 删除任务:EXEC DBMS_SCHEDULER.DROP_JOB('MY_JOB');
使用CRON表达式
repeat_interval => 'FREQ=DAILY;BYHOUR=2;BYMINUTE=30', 每天凌晨2:30执行。 FREQ=WEEKLY;BYDAY=SUN;BYHOUR=1;BYMINUTE=0,每周日凌晨1点。
链式任务
创建链:BEGIN DBMS_SCHEDULER.CREATE_CHAIN ( chain_name => 'my_chain', evaluation_interval => INTERVAL '1' MINUTE); END; / 添加规则和作业到链中,然后创建运行链的任务。
凭证和程序
创建程序:BEGIN DBMS_SCHEDULER.CREATE_PROGRAM ( program_name => 'hello_prog', program_type => 'EXECUTABLE', program_action => '/bin/echo', number_of_arguments => 1, enabled => TRUE); END; / 创建凭证:BEGIN DBMS_SCHEDULER.CREATE_CREDENTIAL ( credential_name => 'local_cred', username => 'oracle', password => 'oracle'); END; /
监控和日志
查看任务日志:SELECT job_name, log_date, status, additional_info FROM dba_scheduler_job_run_details WHERE job_name = 'MY_JOB' ORDER BY log_date DESC; 设置日志级别:EXEC DBMS_SCHEDULER.SET_ATTRIBUTE('MY_JOB','logging_level',DBMS_SCHEDULER.LOGGING_FULL);
FAQ
Q: 如何停止正在运行的任务?
A: EXEC DBMS_SCHEDULER.STOP_JOB('MY_JOB', force => TRUE);
Q: 任务失败怎么处理?
A: 查看dba_scheduler_job_run_details表,检查additional_info列。
Q: 可以用存储过程吗?
A: 是的,job_type => 'STORED_PROCEDURE', job_action => 'PKG.PROC';
Q: 怎么让任务只运行一次?
A: 不设置repeat_interval,只设置start_date。
Q: 权限不够怎么办?
A: 授予用户CREATE JOB和MANAGE SCHEDULER权限。