oracle 制定定時任務


本節摘要:本節介紹使用oracle自帶的job來實現oracle定制定時執行任務。

 
1.引言
定制定時執行的任務有兩種形式,系統級別和 數據庫級別,
從操作系統級別來講,
windows系統我們可以使用任務計划來實現,
對於winXP系統,設置步驟如下,開始---設置---控制面板---任務計划,然后添加任務計划,按向導完成配置即可;  
對於win7系統,設置步驟如下,點擊開始,然后在 搜索程序和文件 框中輸入 [任務計划],然后點擊出來的任務計划程序,創建一個基本任務即可;
linux系統我們可以使用crontab命令來是實現,
關於crontab命令的使用可以見之前的博客(http://www.2cto.com/os/201209/155632. html);
 
從數據庫級別來講,我們可以采用數據庫的job來實現;
本節主要介紹通過oracle數據庫的job來定制一個簡單的定時執行任務。本節會采用oracle定制一個定時向一個表中插入語句。
 這里聊一下我做這個oracle定時任務的緣由:
 項目中要在固定的時間,把一個數據庫中某些表的數據同步到另外一個數據庫,顯然這些工作我不能每次都自己去做,
那么,我要怎么來做呢?這個時候oracle的定時執行任務JOB無疑是我的最佳選擇。我把同步的腳本放在一個存儲過程中,
然后在固定的時間去執行這個存儲過程就OK了。
 注意:以下所有的操作都是在sytem用戶下執行。采用PL/SQL做的客戶端登陸。
 
2.項目環境
安裝oracle10g,然后再安裝PL/SQL,然后用管理員用戶system登陸,
打開SQL Window輸入圖中的SQL語句,操作環境詳細的信息如下:
\
 
3.環境准備
(1)新建一個表,命令為test,建表語句如下:
\test0916
1 create table system.test0916 2 ( 3   seq NUMBER(2) PRIMARY KEY, 4   seqtime  DATE 5 )
在SQL窗口執行以上語句;
(2)新建一個存儲過程,命名為test_proc,存儲過程的語句如下:
\test_proc
 
1 CREATE OR REPLACE PROCEDURE test_proc  IS 2 BEGIN 3   INSERT INTO SYSTEM.TEST0916(SEQ, SEQTIME)  VALUES(NVL((SELECT MAX(SEQ) FROM SYSTEM.TEST0916) + 1, 0), SYSDATE); 4   COMMIT; 5 EXCEPTION 6   WHEN OTHERS THEN 7     DBMS_OUTPUT.PUT_LINE('Exception happened,data was rollback'); 8     ROLLBACK; 9 END;
 
在SQL Window窗口中執行以上存儲過程,執行完成以后,查看Objects下的Procedures菜單,可以看到新建的存儲過程如圖:
\
TEST_PROC前面的圖標沒有紅色的標記,表示存儲過程正常;
(3)檢查oracle的JOB運行環境
我這里遇到的只是要檢查一下oracle的JOB隊列的進程數,如果為0表示不運行JOB,
雖然網上說一般默認為10,但是我安裝oracle以后就不知道為什么是0。
查看進程數:
\
修改進程數(如果你的是0,才需要按照以下語句修改):
我這里已經改為10,假如我要改為11來模擬以下這個操作;
在PL/SQL的command窗口中輸入以下語句:
\修改進程數
alter system set job_queue_processes=10 scope=both;
運行截圖如下:  
\
修改完以后我們這查看一下:
\
看到了吧,我這是是改為11了吧。
補充說明:
網上有的說修改這個進程數可以修改oracle初始文件,最開始我是找到這個初始文件的位置,然后用notepad++打開后去修改,
保存以后我重啟oracle服務和電腦,但是發現此時用PL/SQL登陸oracle的時候,一直報無法識別指定的字符串,這里要說明這樣操作不行。
這里有個問題,我們要如何找到oracle初始文件的位置?可以在PL/SQL的command window窗口中執行以下語句看到:
\
我當時用notepad++修改的是下圖陰影部分的內容:
\
*.job_queue_processes=11
 
4.定制定時執行任務
假設我們要每隔兩分鍾向表test0916中插入一條記錄,這里我們只需要每隔2分鍾執行一次存儲過程test_proc即可。
在PL/SQL的command window輸入以下語句:
\job
1 var job_num number; 2 begin 3    dbms_job.submit(:job_num,'test_proc;',SYSDATE,'sysdate+2/24/60'); 4 end;
 
執行過程的截圖如下:
\
執行完成以后記得點擊PL/SQL的提交按鈕;
 
5.查看執行結果
(1)查看我們新增的JOB是否成功
通過查看DBA_JOBS表中的WHAT字段可以看到最后一條記錄即使我們剛新建的定時任務;
\
(2)查看test0916表是否插入了數據
\
 
6.其他相關說明
(1)如何刪除一個JOB?
在PL/SQL的command window執行以下語句:
exec dbms_job.remove(81);
說明:這里的數字81是對應DBA_JOBS表中當前要刪除的JOB記錄所在行的JOB字段的值;
 
(2)submit的各個參數是什么意思?
 
使用Submit()過程,工作被正常地計划好。  這個過程有五個參數:job、what、next_date、interval與no_parse。  PROCEDURE Submit ( job OUT binary_ineger,  What IN varchar2,  next_date IN date,  interval IN varchar2,  no_parse IN booean:=FALSE) 
job參數是由Submit()過程返回的binary_ineger。這個值用來唯一標識一個工作。 前面有一個雙引號,在SQL windwo中沒有顯示,拷貝到command窗口就可以顯示出來了; what參數是將被執行的PL/SQL代碼塊。這里是存儲過程的名稱,后面有一個英文狀態下的分號不能掉了;  next_date參數指識何時將運行這個工作。 
interval參數何時這個工作將被重執行。 這里加號、括號都必須在英文狀態下輸入; no_parse參數指示此工作在提交時或執行時是否應進行語法分析——TRUE 指示此PL/SQL代碼在它第一次執行時應進行語法分析, 而FALSE指示本PL/SQL代碼應立即進行語法分析。
 
(3)定時執行的時間間隔是怎么設置的?
這里大家可以去百度,網上搜索一般都能找到滿足你需求的,主要是結果TRUNC函數來實現。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM