lamp 1. lamp簡介 有了前面學習的知識的鋪墊,今天可以來學習下第一個常用的web架構了。 所謂lamp,其實就是由Linux+Apache+Mysql/MariaDB+Php/Perl/Python的一組動態網站或者伺服器的開源軟體,除Linux外其它各部件本身都是各自獨立的程式,但是因為 ...
以下例子在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表一樣。