oracle定製定時執行任務

來源:互聯網
上載者:User

本節摘要:本節介紹使用oracle內建的job來實現oracle定製定時執行任務。

 

1.引言

定製定時執行的任務有兩種形式,系統層級和資料庫層級,

從作業系統層級來講,

windows系統我們可以使用任務計劃來實現,

對於winXP系統,設定步驟如下,開始---設定---控制台---任務計劃,然後新增工作計劃,按嚮導完成配置即可;

對於win7系統,設定步驟如下,點擊開始,然後在 搜尋程式和檔案 框中輸入 [任務計劃],然後點擊出來的工作排程器,建立一個基本任務即可;

linux系統我們可以使用crontab命令來是實現,

關於crontab命令的使用可以見之前的部落格(http://www.cnblogs.com/java-pan/archive/2012/07/23/linux.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.test09162 (3   seq NUMBER(2) PRIMARY KEY,4   seqtime  DATE5 )

在SQL視窗執行以上語句;

(2)建立一個預存程序,命名為test_proc,預存程序的語句如下:

test_proc

1 CREATE OR REPLACE PROCEDURE test_proc  IS2 BEGIN3   INSERT INTO SYSTEM.TEST0916(SEQ, SEQTIME)  VALUES(NVL((SELECT MAX(SEQ) FROM SYSTEM.TEST0916) + 1, 0), SYSDATE);4   COMMIT;5 EXCEPTION6   WHEN OTHERS THEN7     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 begin3    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函數來實現。

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.