1.1、查询当前用户是否有创建Job权限
--查询是否有Job权限 select * from session_privs where PRIVILEGE like '%JOB%'; --授予当前用户创建Job权限 GRANT create any job to 用户名;
1.2、创建Job
创建测试表
create table demo (demo_time date);
创建job
-- 使用DBMS_SCHEDULER创建JOB
BEGIN sys.dbms_scheduler.create_job ( --job名称 job_name => 'QUERY_DUAL', --job类型 job_type => 'PLSQL_BLOCK', -- 存储过程名 job_action => 'begin insert into demo values (SYSDATE); end;', -- 开始执行时间 start_date => SYSDATE, --下次执行时间:每天凌晨3点30执行 repeat_interval => 'Freq=Daily;Interval=1;ByHour=03;ByMinute=30;BySecond=00', end_date => TO_DATE (NULL), job_class => 'DEFAULT_JOB_CLASS', enabled => TRUE, -- job禁用后是否自动删除 auto_drop => FALSE, comments => '查询当前时间' ) ; END ; /
START_DATE :指定该调度的开始时间,可为空,当为空时表示该调度暂不起用。
REPEAT_INTERVAL :指定调度的执行频率或周期。
END_DATE :指定调度的结束时间,可为空,为空时就表示该调度将一直进行。
COMMENTS :注释信息。
这其中,比较有技术含量的是REPEAT_INTERVAL参数,REPEAT_INTERVAL 参数的语法结构要复杂的多。其中最重要的是FREQ和INTERVAL两个关键字。FREQ 关键字用来指定间隔的时间周期,可选参数有:YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY, and SECONDLY,分别表示年、月、周、日、时、分、秒等单位。
INTERVAL 关键字用来指定间隔的频繁,可指定的值的范围从1-。
2、使用Job
-- 手动启动job
begin dbms_scheduler.enable('QUERY_DUAL'); end; /
-- 手动运行job
begin dbms_scheduler.run_job('QUERY_DUAL'); end; /
-- 禁用job
begin dbms_scheduler.disable('QUERY_DUAL'); end; /
-- 删除job
begin dbms_scheduler.drop_job('QUERY_DUAL'); end; /
ps:斜杠就是让服务器执行前面所写的sql脚本。
如果是普通的select语句,一个分号,就可以执行了。但是如果是存储过程,那么遇到分号,就不能马上执行了。这个时候,就需要通过斜杠(/)来执行。
3、查看job
-- 查看job信息 select * from user_scheduler_jobs; -- 查看job日志 SELECT * from user_scheduler_job_log where job_name = 'QUERY_DUAL'; --查看job运行日志 SELECT * from user_scheduler_job_run_details;