以下例子在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表一樣,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/500868.html
標籤:Oracle
