Q:Oracle数据库的Job作业创建和使用(定时插入符合条件的数据)

发布时间 2023-09-07 16:29:51作者: 三年三班王小朋

 job和触发器的两种都可以通过达成某种条件执行任务。

不同的是job是定时触发,触发器的dml事务触发

1、创建JOB

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 ;
/
SCHEDULE_NAME :指定schedule名称,注意名称不能重复。
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;