Oracle调度器Scheduler

打印 上一主题 下一主题

主题 862|帖子 862|积分 2586

以下例子在scott用户下进行:
一、查看
先查看一下  当前用户的scheduler   的所有数据字典,看看要关注什么
  1. <br>SET LINE 200 PAGESIZE 2000<br>COL TABLE_NAME FOR A60<br>COL COMMENTS FOR A120<br>SELECT TABLE_NAME,COMMENTS FROM DICTIONARY WHERE TABLE_NAME LIKE '%USER_SCHEDULER%' ORDER BY 1;<br><br>
复制代码
一大堆数据字典,暂时关注其中的三个,
  1. SELECT * FROM USER_SCHEDULER_PROGRAMS;
  2. SELECT * FROM USER_SCHEDULER_SCHEDULES;
  3. 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
  1. grant create table to scott;
  2. grant create procedure to scott;
  3. grant create job to scott;
复制代码
 
先创建一个临时表:
  1. create table temp as select * from emp where 1=2;
复制代码
 
创建一个存储过程,作用:找出emp表的sal>1000的所有信息,插入到temp表中。
注意:在创建此存储过程之前把 or replace去掉,防止把已存在的procedure覆盖掉。
  1. create or replace procedure my_procedure
  2. as
  3. cursor my_cur is select EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO from emp where sal>1000;
  4. begin
  5. for i in my_cur loop
  6. insert into temp values (i.EMPNO,i.ENAME,i.JOB,i.MGR,i.HIREDATE,i.SAL,i.COMM,i.DEPTNO);
  7. end loop;
  8. end;
  9. /
复制代码
 
下面创建一个scheduler.program,program_action指定上面的存储过程
  1. begin
  2. dbms_scheduler.create_program(
  3. program_name=>'scott.my_program_01',
  4. program_type=>'stored_procedure',
  5. program_action=>'my_procedure',
  6. enabled=>true,
  7. comments=>'这是我的第一个scheduler.program'
  8. );
  9. end;
  10. /
复制代码
 
随后创建一个scheduler.schedule,为了能尽快看到效果,把FREQ指定为SECONDLY类型,INTERVAL为30秒
附:为了忘记关掉,结束时间设置为开始后的1小时
  1. begin
  2. dbms_scheduler.create_schedule(
  3. schedule_name=>'scott.my_schedule_01',
  4. start_date=>sysdate,
  5. repeat_interval=>'freq=secondly;interval=30',
  6. end_date=>sysdate+1/24,
  7. comments=>'这是我的第一个scheduler.schedule'
  8. );
  9. end;
  10. /
复制代码
 
最后,创建一个job,启用按schedule计划执行program
  1. begin
  2. dbms_scheduler.create_job(
  3. job_name=>'scott.my_job_01',
  4. program_name=>'scott.my_program_01',
  5. schedule_name=>'scott.my_schedule_01',
  6. enabled=>TRUE,
  7. comments=>'这是我的第一个scheduler.job'
  8. );
  9. end;
  10. /
复制代码
 
等一段时间,查看temp表,不出意外的话已经有数据了。
 
随后查看数据字典
  1. SELECT * FROM USER_SCHEDULER_PROGRAMS;
  2. SELECT * FROM USER_SCHEDULER_SCHEDULES;
  3. SELECT * FROM USER_SCHEDULER_JOBS;
复制代码
可以看到program、schedule、job的信息。
 
 
二、停止与禁用与启用
停止只跟JOB有关,就相当于闹钟响了,停止正常响着的闹钟,但是明天闹钟该响还是响。
附:闹钟响多久(JOB IS RUNNING) 取决于执行的速度;
  1. EXEC DBMS_SCHEDULER.STOP_JOB('SCOTT.JOB');
复制代码
禁用就相当于把闹钟给关了,明天这个闹钟也不响了,除非再把这个闹钟打开。
  1. EXEC DBMS_SCHEDULER.DISABLE('SCOTT.MY_JOB_01');
复制代码
与禁用相对的就是启用
  1. EXEC DBMS_SCHEDULER.ENABLE('SCOTT.MY_JOB_01');
复制代码
 
 
三、修改
嘿,计划总赶不上变化,我决定换个时间
  1. --修改schedule的start_date为当前时间<br>EXEC DBMS_SCHEDULER.SET_ATTRIBUTE('SCOTT.MY_SCHEDULE_01','START_DATE',SYSDATE);<br>--修改schedule的end_date为一小时后
  2. EXEC DBMS_SCHEDULER.SET_ATTRIBUTE('SCOTT.MY_SCHEDULE_01','END_DATE',SYSDATE+1/24);
复制代码
 
四、删除
 嗐,计划取消
  1. EXEC DBMS_SCHEDULER.DROP_JOB('SCOTT.MY_JOB_01');<br>EXEC DBMS_SCHEDULER.DROP_SCHEDULE('MY_SCHEDULE_01');<br>EXEC DBMS_SCHEDULER.DROP_PROGRAM('MY_PROGRAM_01');
复制代码
 
附:存储过程my_procedure的删除和temp表一样。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

兜兜零元

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表