通過網(wǎng)上查詢,找到一種方案,就是先在oracle里面對要定時(shí)的sql寫成存儲過程,再用DBMS_scheduler對存儲過程進(jìn)行定時(shí)執(zhí)行。

創(chuàng)新互聯(lián)是一家專業(yè)提供靜樂企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為靜樂眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。
在數(shù)據(jù)庫中新建了一個(gè)表MY_JOB_TEST
在數(shù)據(jù)庫中新建了一個(gè)表MY_JOB_TEST
在數(shù)據(jù)庫中新建了一個(gè)表MY_JOB_TEST
在PLSQL中,執(zhí)行下面語句模擬存儲過程的調(diào)用,執(zhí)行后要點(diǎn)提交才有反應(yīng)
[sql] view plain copy
BEGIN
INSERT?INTO?MY_JOB_TEST?(NUM)?VALUES?(1);
END;
然后下面建立一個(gè)存儲過程JOB_TEST
(注意,這里用戶需要CREATE JOB權(quán)限,可以用超級管理員用戶執(zhí)行下面語句給指定用戶賦予該權(quán)限)
[sql] view plain copy
Grant?Create?Job?To?指定用戶名
[sql] view plain copy
SQLCREATE?OR?REPLACE?PROCEDURE
JOB_TEST
BEGIN
INSERT?INTO?MY_JOB_TEST?(NUM)?VALUES?(1);
END;
(此處要執(zhí)行存儲過程不能用exec JB_TEST,這種執(zhí)行方式只能在命令行中使用)
使用DBMS_SCHEDULER進(jìn)行定時(shí),這里為每分鐘執(zhí)行一次
[sql] view plain copy
SQL?BEGIN
DBMS_SCHEDULER.CREATE_JOB?(
job_name???????????=??'SCHEDULER_TEST',
job_type???????????=??'STORED_PROCEDURE',
job_action?????????=??'JOB_TEST',
start_date?????????=??sysdate,
repeat_interval????=??'FREQ=MINUTELY;INTERVAL=1');
END;
但是這樣子定時(shí)任務(wù)并不會執(zhí)行。
我們可以用下面的命令查看一下scheduler的狀態(tài)
[plain] view plain copy
SQLSELECT?*?FROM?USER_SCHEDULER_JOBS;
此時(shí)我們可以看到enable的狀態(tài)是false的,因此我們需要去啟動(dòng)定時(shí)任務(wù)
[plain] view plain copy
SQLBEGIN
DBMS_SCHEDULER.ENABLE('SCHEDULER_TEST');
END
dbms_scheduler.enable('j_test'); ?--啟用jobs ??
dbms_scheduler.disable('j_test'); ?--禁用jobs ? ?
dbms_scheduler.run_job('j_test'); ?--執(zhí)行jobs ? ?
dbms_scheduler.stop_job('j_test'); ?--停止jobs ??
dbms_scheduler.drop_job('j_test'); ?--刪除jobs ?
然后再查詢job的enable裝態(tài),發(fā)現(xiàn)為true了。
然后查看MY_JOB_TEST表,發(fā)現(xiàn)每分鐘會往里面添加記錄。
當(dāng)需要修改定時(shí)任務(wù)或者調(diào)度的其他屬性時(shí),可以用下面的
dbms_scheduler.set_attribute('調(diào)度名','調(diào)度屬性','調(diào)度值');
至此,定時(shí)任務(wù)完成。
--當(dāng)前用戶定時(shí)任務(wù)
select?count(*)?from?user_jobs;
--有權(quán)限訪問的定時(shí)任務(wù)
select?count(*)?from?all_jobs;
--整個(gè)數(shù)據(jù)庫所有定時(shí)任務(wù)
select?count(*)?from?dba_jobs;
你確定你搜了么。。。
以下是物化視圖的建立,注意是refresh mode是 on demand還是on commit
ON DEMAND顧名思義,僅在該物化視圖“需要”被刷新了,才進(jìn)行刷新(REFRESH),即更新物化視圖,以保證和基表數(shù)據(jù)的一致性;而ON COMMIT是說,一旦基表有了COMMIT,即事務(wù)提交,則立刻刷新,立刻更新物化視圖,使得數(shù)據(jù)和基表一致。
創(chuàng)建物化視圖時(shí)未作指定,則Oracle按ON DEMAND模式來創(chuàng)建。
但怎么更新?或者說物化視圖的數(shù)據(jù)怎么隨著基表而更新?Oracle提供了兩種方式,手工刷新和自動(dòng)刷新,像我們這種,在物化視圖定義時(shí),未作任何指定,那當(dāng)然是默認(rèn)的手工刷新了。也就是說,通過我們手工的執(zhí)行某個(gè)Oracle提供的系統(tǒng)級存儲過程或包,來保證物化視圖與基表數(shù)據(jù)一致性。
所謂的自動(dòng)刷新,其實(shí)也就是Oracle會建立一個(gè)job,通過這個(gè)job來調(diào)用相同的存儲過程或包
CREATE MATERIALIZED VIEW mview_name
[TABLESPACE ts_name]
[PARALLEL (DEGREE n)]
[BUILD {IMMEDIATE|DEFERRED}]
[{ REFRESH {FAST|COMPLETE|FORCE}
[{ON COMMIT|ON DEMAND}]
| NEVER REFRESH } ]
[{ENABLE|DISABLE} QUERY REWRITE]
AS SELECT … FROM …
基于你說的情況,有job的定時(shí)刷新,應(yīng)該是on commit的情況,或者是手動(dòng)建立的job
下面給出我的測試:
create materialized view scott.MV_test_index
refresh force on commit
as
select * from scott.test_index;
SQL select count(*) from mv_test_index;
COUNT(*)
----------
50195
SQL delete from test_index where rownum=1;
1 row deleted.
SQL commit;
Commit complete.
SQL select count(*) from mv_test_index;
COUNT(*)
----------
50194
這里我們發(fā)現(xiàn)commit的時(shí)間會有些長,因?yàn)橥瑫r(shí)要刷新物化視圖,我們這里其實(shí)是重新做了刪除物化視圖數(shù)據(jù)和插入新數(shù)據(jù)的操作(因?yàn)樗⑿碌姆椒ㄊ莄omplete,當(dāng)然你可以選擇FAST來做增量刷新,而且fast是首選),然后物化視圖已經(jīng)更新了。
下面是開啟session sql trace的結(jié)構(gòu),你可以看到commit之后oralce所做的操作。
********************************************************************************
commit
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.11 0.23 0 0 1 0
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 2 0.11 0.23 0 0 1 0
Misses in library cache during parse: 0
Parsing user id: 54
********************************************************************************
SELECT /* OPT_DYN_SAMP */ /*+ ALL_ROWS IGNORE_WHERE_CLAUSE
NO_PARALLEL(SAMPLESUB) opt_param('parallel_execution_enabled', 'false')
NO_PARALLEL_INDEX(SAMPLESUB) NO_SQL_TUNE */ NVL(SUM(C1),:"SYS_B_0"),
NVL(SUM(C2),:"SYS_B_1")
FROM
(SELECT /*+ NO_PARALLEL("MV_TEST_INDEX") FULL("MV_TEST_INDEX")
NO_PARALLEL_INDEX("MV_TEST_INDEX") */ :"SYS_B_2" AS C1, :"SYS_B_3" AS C2
FROM "SCOTT"."MV_TEST_INDEX" SAMPLE BLOCK (:"SYS_B_4" , :"SYS_B_5") SEED
(:"SYS_B_6") "MV_TEST_INDEX") SAMPLESUB
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 1 0.07 0.19 44 69 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 3 0.07 0.19 44 69 0 1
Misses in library cache during parse: 1
Misses in library cache during execute: 1
Optimizer mode: ALL_ROWS
Parsing user id: 54 (recursive depth: 2)
Rows Row Source Operation
------- ---------------------------------------------------
1 SORT AGGREGATE (cr=69 pr=44 pw=0 time=196762 us)
10624 MAT_VIEW ACCESS SAMPLE MV_TEST_INDEX (cr=69 pr=44 pw=0 time=1853189 us)
********************************************************************************
delete from "SCOTT"."MV_TEST_INDEX"
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.02 0.01 0 3 0 0
Execute 1 7.48 9.46 20 321 154984 50194
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 2 7.50 9.48 20 324 154984 50194
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 54 (recursive depth: 1)
Rows Row Source Operation
------- ---------------------------------------------------
0 DELETE MV_TEST_INDEX (cr=371 pr=20 pw=0 time=9503556 us)
50194 MAT_VIEW ACCESS FULL MV_TEST_INDEX (cr=310 pr=20 pw=0 time=1355940 us)
********************************************************************************
INSERT /*+ */ INTO "SCOTT"."MV_TEST_INDEX"("OBJECT_ID","OBJECT_NAME") SELECT
"TEST_INDEX"."OBJECT_ID","TEST_INDEX"."OBJECT_NAME" FROM
"SCOTT"."TEST_INDEX" "TEST_INDEX"
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.01 0.01 0 0 0 0
Execute 1 5.90 12.87 0 777 103790 50193
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 2 5.91 12.88 0 777 103790 50193
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 54 (recursive depth: 1)
Rows Row Source Operation
------- ---------------------------------------------------
50193 TABLE ACCESS FULL TEST_INDEX (cr=241 pr=0 pw=0 time=602379 us)
********************************************************************************
BEGIN dbms_session.set_sql_trace(false); END;
接下來看看fast的刷新方法:
CREATE MATERIALIZED VIEW LOG ON scott.test_index; --這里我試過yantinkun的那個(gè)網(wǎng)頁,是不能加with rowid的,會報(bào)錯(cuò):ORA-23415: materialized view log for does not record the primary key
DROP materialized view log on scott.test_index;
create materialized view scott.MV_test_index
refresh fast on commit
as
select * from scott.test_index;
SQL exec dbms_session.set_sql_trace(true);
PL/SQL procedure successfully completed.
SQL delete from test_index where rownum=1;
1 row deleted.
SQL commit;
Commit complete.
SQL exec dbms_session.set_sql_trace(false);
PL/SQL procedure successfully completed.
SQL host
這次的commit快多了,因?yàn)橹皇窃隽康乃⑿拢?/p>
看下log中有這樣一行:
DELETE FROM "SCOTT"."MV_TEST_INDEX" SNAP$
WHERE
"OBJECT_ID" = :1
只是找到了多出來的那個(gè)object的id,然后從物化視圖里刪掉就ok了。
可以查看物化視圖的開始刷新時(shí)間,通過查看視圖
select * from mlog$ where mowner='SCOTT' and MASTER='TEST_INDEX'來查找對應(yīng)建立的物化視圖的log,我這里查出來的是scott.MLOG$_TEST_INDEX
然后執(zhí)行查詢就可以看到詳細(xì)的信息了:
select * from scott.MLOG$_TEST_INDEX
然后是刷新的時(shí)間,當(dāng)刷新選項(xiàng)是commit的時(shí)候你是沒法看的,只能從session的trace里面估計(jì),
on demand話就是你自定義的job 來執(zhí)行exec dbms_mview.refresh('MV_TEST_INDEX)
這個(gè)是可以看的,可以從user_jobs這個(gè)視圖來看,里面有個(gè)total_time來記錄job的執(zhí)行總時(shí)間。
1.引言
定制定時(shí)執(zhí)行的任務(wù)有兩種形式,系統(tǒng)級別和數(shù)據(jù)庫級別,
從操作系統(tǒng)級別來講,
windows系統(tǒng)我們可以使用任務(wù)計(jì)劃來實(shí)現(xiàn),
對于winXP系統(tǒng),設(shè)置步驟如下,開始---設(shè)置---控制面板---任務(wù)計(jì)劃,然后添加任務(wù)計(jì)劃,按向?qū)瓿膳渲眉纯?
對于win7系統(tǒng),設(shè)置步驟如下,點(diǎn)擊開始,然后在 搜索程序和文件 框中輸入 [任務(wù)計(jì)劃],然后點(diǎn)擊出來的任務(wù)計(jì)劃程序,創(chuàng)建一個(gè)基本任務(wù)即可;
linux系統(tǒng)我們可以使用crontab命令來是實(shí)現(xiàn),
關(guān)于crontab命令的使用可以見之前的博客();
從數(shù)據(jù)庫級別來講,我們可以采用數(shù)據(jù)庫的job來實(shí)現(xiàn);
本節(jié)主要介紹通過oracle數(shù)據(jù)庫的job來定制一個(gè)簡單的定時(shí)執(zhí)行任務(wù)。本節(jié)會采用oracle定制一個(gè)定時(shí)向一個(gè)表中插入語句。
這里聊一下我做這個(gè)oracle定時(shí)任務(wù)的緣由:
項(xiàng)目中要在固定的時(shí)間,把一個(gè)數(shù)據(jù)庫中某些表的數(shù)據(jù)同步到另外一個(gè)數(shù)據(jù)庫,顯然這些工作我不能每次都自己去做,
那么,我要怎么來做呢?這個(gè)時(shí)候oracle的定時(shí)執(zhí)行任務(wù)JOB無疑是我的最佳選擇。我把同步的腳本放在一個(gè)存儲過程中,
然后在固定的時(shí)間去執(zhí)行這個(gè)存儲過程就OK了。
注意:以下所有的操作都是在sytem用戶下執(zhí)行。采用PL/SQL做的客戶端登陸。
2.項(xiàng)目環(huán)境
安裝oracle10g,然后再安裝PL/SQL,然后用管理員用戶system登陸,
打開SQL Window輸入圖中的SQL語句,操作環(huán)境詳細(xì)的信息如下:
3.環(huán)境準(zhǔn)備
(1)新建一個(gè)表,命令為test,建表語句如下:
test0916
1 create table system.test0916 2 ( 3 seq NUMBER(2) PRIMARY KEY, 4 seqtime DATE 5 )
在SQL窗口執(zhí)行以上語句;
(2)新建一個(gè)存儲過程,命名為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窗口中執(zhí)行以上存儲過程,執(zhí)行完成以后,查看Objects下的Procedures菜單,可以看到新建的存儲過程如圖:
TEST_PROC前面的圖標(biāo)沒有紅色的標(biāo)記,表示存儲過程正常;
(3)檢查oracle的JOB運(yùn)行環(huán)境
我這里遇到的只是要檢查一下oracle的JOB隊(duì)列的進(jìn)程數(shù),如果為0表示不運(yùn)行JOB,
雖然網(wǎng)上說一般默認(rèn)為10,但是我安裝oracle以后就不知道為什么是0。
查看進(jìn)程數(shù):
修改進(jìn)程數(shù)(如果你的是0,才需要按照以下語句修改):
我這里已經(jīng)改為10,假如我要改為11來模擬以下這個(gè)操作;
在PL/SQL的command窗口中輸入以下語句:
修改進(jìn)程數(shù)
alter system set job_queue_processes=10 scope=both;
運(yùn)行截圖如下:
修改完以后我們這查看一下:
看到了吧,我這是是改為11了吧。
補(bǔ)充說明:
網(wǎng)上有的說修改這個(gè)進(jìn)程數(shù)可以修改oracle初始文件,最開始我是找到這個(gè)初始文件的位置,然后用notepad++打開后去修改,
保存以后我重啟oracle服務(wù)和電腦,但是發(fā)現(xiàn)此時(shí)用PL/SQL登陸oracle的時(shí)候,一直報(bào)無法識別指定的字符串,這里要說明這樣操作不行。
這里有個(gè)問題,我們要如何找到oracle初始文件的位置?可以在PL/SQL的command window窗口中執(zhí)行以下語句看到:
我當(dāng)時(shí)用notepad++修改的是下圖陰影部分的內(nèi)容:
*.job_queue_processes=11
4.定制定時(shí)執(zhí)行任務(wù)
假設(shè)我們要每隔兩分鐘向表test0916中插入一條記錄,這里我們只需要每隔2分鐘執(zhí)行一次存儲過程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;
執(zhí)行過程的截圖如下:
執(zhí)行完成以后記得點(diǎn)擊PL/SQL的提交按鈕;
5.查看執(zhí)行結(jié)果
(1)查看我們新增的JOB是否成功
通過查看DBA_JOBS表中的WHAT字段可以看到最后一條記錄即使我們剛新建的定時(shí)任務(wù);
(2)查看test0916表是否插入了數(shù)據(jù)
6.其他相關(guān)說明
(1)如何刪除一個(gè)JOB?
在PL/SQL的command window執(zhí)行以下語句:
exec dbms_job.remove(81);
說明:這里的數(shù)字81是對應(yīng)DBA_JOBS表中當(dāng)前要?jiǎng)h除的JOB記錄所在行的JOB字段的值;
(2)submit的各個(gè)參數(shù)是什么意思?
使用Submit()過程,工作被正常地計(jì)劃好。 這個(gè)過程有五個(gè)參數(shù):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參數(shù)是由Submit()過程返回的binary_ineger。這個(gè)值用來唯一標(biāo)識一個(gè)工作。 前面有一個(gè)雙引號,在SQL windwo中沒有顯示,拷貝到command窗口就可以顯示出來了; what參數(shù)是將被執(zhí)行的PL/SQL代碼塊。這里是存儲過程的名稱,后面有一個(gè)英文狀態(tài)下的分號不能掉了; next_date參數(shù)指識何時(shí)將運(yùn)行這個(gè)工作。
interval參數(shù)何時(shí)這個(gè)工作將被重執(zhí)行。 這里加號、括號都必須在英文狀態(tài)下輸入; no_parse參數(shù)指示此工作在提交時(shí)或執(zhí)行時(shí)是否應(yīng)進(jìn)行語法分析——TRUE 指示此PL/SQL代碼在它第一次執(zhí)行時(shí)應(yīng)進(jìn)行語法分析, 而FALSE指示本PL/SQL代碼應(yīng)立即進(jìn)行語法分析。
(3)定時(shí)執(zhí)行的時(shí)間間隔是怎么設(shè)置的?
這里大家可以去百度,網(wǎng)上搜索一般都能找到滿足你需求的,主要是結(jié)果TRUNC函數(shù)來實(shí)現(xiàn)。
主要是管理Jobs物件(Jobs頁簽)
JOB分類有dba_jobs
,
all_jobs
,
user_jobs
,
dba_jobs_running
查詢所有JOB
SELECT
JOB,
NEXT_DATE,
NEXT_SEC,
FAILURES,
BROKEN
FROM
ALL_JOBS;
或
SELECT
*
FROM
ALL_JOBS;
刪除JOB
(一個(gè)一個(gè)刪,我不記得有沒有一次全刪的命令)
begin
dbms_job.remove(:job);
--:job可以用dba_jobs.job的值代替如:1198
end;
你提供的信息太少,我估計(jì)你說的是oracle的定時(shí)處理任務(wù)的機(jī)制。查看任務(wù)隊(duì)列,如果要查看當(dāng)前用戶的定時(shí)任務(wù)隊(duì)列,可以通過查詢user_jobs視圖或dba_jobs.
select last_date from user_jobs;可以查看所有任務(wù)上次成功執(zhí)行的時(shí)間。
文章標(biāo)題:如何查看oracle定時(shí) 如何查看oracle定時(shí)任務(wù)
URL網(wǎng)址:http://chinadenli.net/article44/hpjphe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、全網(wǎng)營銷推廣、App開發(fā)、營銷型網(wǎng)站建設(shè)、建站公司、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)