ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Oracle调度器Scheduler

2022-08-03 02:00:55  阅读:253  来源: 互联网

标签:闹钟 01 Scheduler schedule 调度 JOB program SCHEDULER Oracle


以下例子在scott用户下进行:

一、查看

先查看一下  当前用户的scheduler   的所有数据字典,看看要关注什么


SET LINE 200 PAGESIZE 2000
COL TABLE_NAME FOR A60
COL COMMENTS FOR A120
SELECT TABLE_NAME,COMMENTS FROM DICTIONARY WHERE TABLE_NAME LIKE '%USER_SCHEDULER%' ORDER BY 1;

一大堆数据字典,暂时关注其中的三个,

SELECT * FROM USER_SCHEDULER_PROGRAMS;
SELECT * FROM USER_SCHEDULER_SCHEDULES;
SELECT * FROM USER_SCHEDULER_JOBS;

 

 

 

comments里有解析,但是我有不一样的想法,具体化为一个例子:我调了个闹钟,

闹钟响起要做什么(USER_SCHEDULER_PROGRAMS),

闹钟什么时候响(USER_SCHEDULER_SCHEDULES),

闹钟是否开启(USER_SCHEDULER_JOBS);

 

关于program、schedule、job的参数请参考:DBMS_SCHEDULER (oracle.com)

二、创建

在使用scheduler之前,最好先考虑一下要做什么(为什么设置这个闹钟)

我没想好,干脆把emp表的信息插入到一个临时表中吧。

 

先在sys用户把创建表、存储过程、JOB的权限给SCOTT

grant create table to scott;
grant create procedure to scott;
grant create job to scott;

 

先创建一个临时表:

create table temp as select * from emp where 1=2;

 

创建一个存储过程,作用:找出emp表的sal>1000的所有信息,插入到temp表中。

注意:在创建此存储过程之前把 or replace去掉,防止把已存在的procedure覆盖掉。

create or replace procedure my_procedure
as
cursor my_cur is select EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO from emp where sal>1000;
begin
for i in my_cur loop
insert into temp values (i.EMPNO,i.ENAME,i.JOB,i.MGR,i.HIREDATE,i.SAL,i.COMM,i.DEPTNO);
end loop;
end;
/

 

下面创建一个scheduler.program,program_action指定上面的存储过程

begin
dbms_scheduler.create_program(
program_name=>'scott.my_program_01',
program_type=>'stored_procedure',
program_action=>'my_procedure',
enabled=>true,
comments=>'这是我的第一个scheduler.program'
);
end;
/

 

随后创建一个scheduler.schedule,为了能尽快看到效果,把FREQ指定为SECONDLY类型,INTERVAL为30秒

附:为了忘记关掉,结束时间设置为开始后的1小时

begin
dbms_scheduler.create_schedule(
schedule_name=>'scott.my_schedule_01',
start_date=>sysdate,
repeat_interval=>'freq=secondly;interval=30',
end_date=>sysdate+1/24,
comments=>'这是我的第一个scheduler.schedule'
);
end;
/

 

最后,创建一个job,启用按schedule计划执行program

begin
dbms_scheduler.create_job(
job_name=>'scott.my_job_01',
program_name=>'scott.my_program_01',
schedule_name=>'scott.my_schedule_01',
enabled=>TRUE,
comments=>'这是我的第一个scheduler.job'
);
end;
/

 

等一段时间,查看temp表,不出意外的话已经有数据了。

 

随后查看数据字典

SELECT * FROM USER_SCHEDULER_PROGRAMS;
SELECT * FROM USER_SCHEDULER_SCHEDULES;
SELECT * FROM USER_SCHEDULER_JOBS;

可以看到program、schedule、job的信息。

 

 

二、停止与禁用与启用

停止只跟JOB有关,就相当于闹钟响了,停止正常响着的闹钟,但是明天闹钟该响还是响。

附:闹钟响多久(JOB IS RUNNING) 取决于执行的速度;

EXEC DBMS_SCHEDULER.STOP_JOB('SCOTT.JOB');

禁用就相当于把闹钟给关了,明天这个闹钟也不响了,除非再把这个闹钟打开。

EXEC DBMS_SCHEDULER.DISABLE('SCOTT.MY_JOB_01');

与禁用相对的就是启用

EXEC DBMS_SCHEDULER.ENABLE('SCOTT.MY_JOB_01');

 

 

三、修改

嘿,计划总赶不上变化,我决定换个时间

--修改schedule的start_date为当前时间
EXEC DBMS_SCHEDULER.SET_ATTRIBUTE('SCOTT.MY_SCHEDULE_01','START_DATE',SYSDATE);
--修改schedule的end_date为一小时后 EXEC DBMS_SCHEDULER.SET_ATTRIBUTE('SCOTT.MY_SCHEDULE_01','END_DATE',SYSDATE+1/24);

 

四、删除

 嗐,计划取消

EXEC DBMS_SCHEDULER.DROP_JOB('SCOTT.MY_JOB_01');
EXEC DBMS_SCHEDULER.DROP_SCHEDULE('MY_SCHEDULE_01');
EXEC DBMS_SCHEDULER.DROP_PROGRAM('MY_PROGRAM_01');

 

附:存储过程my_procedure的删除和temp表一样。

标签:闹钟,01,Scheduler,schedule,调度,JOB,program,SCHEDULER,Oracle
来源: https://www.cnblogs.com/wfkfytmy/p/16545605.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有