十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊
量身定制 + 運營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
本篇內(nèi)容主要講解“Oracle調(diào)度Schedule特性chains分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Oracle調(diào)度Schedule特性chains分析”吧!
創(chuàng)新互聯(lián)是專業(yè)的綿竹網(wǎng)站建設(shè)公司,綿竹接單;提供網(wǎng)站建設(shè)、網(wǎng)站制作,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行綿竹網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!
舉個簡單的例子:運行PROGRAM:A以及PROGRAM:B,
如果成功的話繼續(xù)運行PROGRAM:C,否則的話運行PROGRAM:D。Programs:A、B、C、D以及執(zhí)行的邏輯關(guān)系就構(gòu)成了一個最簡單的CHAIN。
CHAIN的管理操作比較多:創(chuàng)建/刪除/修改Chains,添加/修改/刪除Chain Steps等等。
1、創(chuàng)建Chains
創(chuàng)建CHAIN使用DBMS_SCHEDULER.CREATE_CHAIN過程,這個過程調(diào)用非常簡單,因為需要指定的參數(shù)極少
在創(chuàng)建Chain時,甚至可以簡單到只指定一個CHAIN的名稱,其它均為空即可
begin
dbms_scheduler.create_chain('mychain1');
end;
創(chuàng)建好的Chains,可以通過*_SCHEDULER_CHAINS視圖查看,例如:
SQL> select chain_name from user_scheduler_chains;
CHAIN_NAME
----------------
MYCHAIN1
注意,創(chuàng)建了CHAIN是遠(yuǎn)遠(yuǎn)不夠的,只有一個CHAIN對象ORACLE還是啥也干不了(當(dāng)然啦,相信從上面執(zhí)行的創(chuàng)建語句大家也看出來了),
CHAIN對象創(chuàng)建之后,要做的工作其實才剛剛開始。其后,還需要定義Chain Steps以及Chain rules。
2、創(chuàng)建Chain Step
Chain Steps 就是用來指定CHAIN執(zhí)行的操作及執(zhí)行步驟,創(chuàng)建CHAIN STEP是通過DBMS_SCHEDULER.DEFINE_CHAIN_STEP過程進(jìn)行
為剛剛創(chuàng)建的mychain1添加一個step
begin
dbms_scheduler.define_chain_step(chain_name => 'mychain1',
step_name => 'mystep1',
program_name => 'myprogram1');
end;
Chain Steps 即可以調(diào)用PROGRAM(注意是program,不是procedure,當(dāng)然program中可以定義執(zhí)行procedure),也可以調(diào)用EVENT,甚至調(diào)用其它CHAIN(嵌套CHAIN)。
下面接著為mychain1添加兩個step,操作如下:
begin
dbms_scheduler.define_chain_step(chain_name => 'mychain1',
step_name => 'mystep2',
program_name => 'myprogram2');
dbms_scheduler.define_chain_step(chain_name => 'mychain1',
step_name => 'mystep3',
program_name => 'myprogram3');
end;
要查詢定義的Chain Steps,則是通過*_SCHEDULER_CHAIN_STEPS視圖,例如:
select chain_name,step_name,program_name from user_scheduler_chain_steps;
CHAIN_NAME STEP_NAME PROGRAM_NAME
------------------------------ ------------------------------ ---------------
MYCHAIN1 MYSTEP1 MYPROGRAM1
MYCHAIN1 MYSTEP2 MYPROGRAM2
MYCHAIN1 MYSTEP3 MYPROGRAM3
3、創(chuàng)建Chain Rule
接下來,要為CHAIN的運行定義規(guī)則。定義規(guī)則是使用DBMS_SCHEDULER.DEFINE_CHAIN_RULE過程,Chain Rules依賴于Chain Steps,
每個CHAIN RULE都擁有condition和action屬性,當(dāng)滿足condition時則執(zhí)行action中指定的step。
舉個例子:創(chuàng)建CHAIN RULE,首先執(zhí)行mystep1,如果mystep1成功執(zhí)行的話,就繼續(xù)執(zhí)行mystep2,如果mystep2也成功執(zhí)行的話,則結(jié)束該CHAIN,創(chuàng)建腳本如下
begin
dbms_scheduler.define_chain_rule(chain_name => 'mychain1',
condition => 'true',
action => 'start mystep1',
rule_name => 'myrule1');
dbms_scheduler.define_chain_rule(chain_name => 'mychain1',
condition => 'mystep1 completed',
action => 'start mystep2',
rule_name => 'myrule2');
dbms_scheduler.define_chain_rule(chain_name => 'mychain1',
condition => 'mystep2 completed',
action => 'end 0',
rule_name => 'myrule3');
end;
CHAIN_NAME 就不說了,這里需要注意的是CONDITION和ACTION兩個參數(shù)。在為CONDITION參數(shù)指定值時,其語法看起來稍稍復(fù)雜一些,或者說是靈活,CONDITION參數(shù)值支持下列的語法形式:
TRUE
FALSE
stepname [NOT] SUCCEEDED
stepname [NOT] FAILED
stepname [NOT] STOPPED
stepname [NOT] COMPLETED
stepname ERROR_CODE IN (integer, integer, integer ...)
stepname ERROR_CODE NOT IN (integer, integer, integer ...)
stepname ERROR_CODE = integer
stepname ERROR_CODE != integer
stepname ERROR_CODE <> integer
stepname ERROR_CODE > integer
stepname ERROR_CODE >= integer
stepname ERROR_CODE < integer
stepname ERROR_CODE <= integer
甚至于,還可以制定成下列邏輯語法:
expression AND expression
expression OR expression
NOT (expression)
比如說,我們希望條件為step1成功運行,那么可以指定condition參數(shù)值如下:
'step1 completed'
Action 參數(shù)相對簡單一些,這個參數(shù)用來指定當(dāng)滿足condition參數(shù)時,CHAIN執(zhí)行的操作。
4、運行Chains
最后,來運行一下創(chuàng)建的mychain1吧,手動運行CHAIN是通過DBMS_SCHEDULER.RUN_CHAIN過程
begin
dbms_scheduler.run_chain(chain_name => 'mychain1',
start_steps => 'mystep1');
end;
這個語句執(zhí)行可能會報錯呦,注意往下看
語句執(zhí)行成功,查看一下執(zhí)行的結(jié)果。我們之前定義的myprogram1等program對象,實際上是調(diào)用procedure,向一個指定表test中插入記錄,這里直接查詢一下該表,就知道執(zhí)行情況了(在此之前,test表為空):
3個procedure和3個program:
create or replace procedure P_INSERT_INTOTEST is
begin
insert into test values(1,'beer');
commit;
end;
create or replace procedure insert_test1 is
begin
insert into test values (1, 'beer');
end;
begin
dbms_scheduler.create_program(program_name => 'myprogram1', program_type => 'STORED_PROCEDURE', program_action => 'insert_test1', enabled => true);
end;
create or replace procedure insert_test2 is
begin
insert into test values (2, 'rabbit');
end;
begin
dbms_scheduler.create_program(program_name => 'myprogram2', program_type => 'STORED_PROCEDURE', program_action => 'insert_test2', enabled => true);
end;
create or replace procedure insert_test3 is
begin
insert into test values (3, 'horse');
end;
begin
dbms_scheduler.create_program(program_name => 'myprogram3', program_type => 'STORED_PROCEDURE', program_action => 'insert_test3', enabled => true);
end;
SQL> select * from test;
ID NAME
---------- --------------------
1 beer
2 rabbit
你看,test表中有了兩條記錄,對應(yīng)前面設(shè)置的CHAIN RULE,說明mystep1和mystep2均已正確執(zhí)行。
提示:Chains在執(zhí)行前,必須被置于enabled狀態(tài),默認(rèn)情況下剛剛創(chuàng)建的CHAIN都是disabled狀態(tài),要修改Chains的狀態(tài),
還是通過DBMS_SCHEDULER.ENABLE和DBMS_SCHEDULER.DISABLE兩過程
begin
dbms_scheduler.enable('mychain1');
end;
手動執(zhí)行的CHAIN的話沒有系統(tǒng)級的日志記錄,因此如果希望看到詳細(xì)執(zhí)行情況的話,可以創(chuàng)建job來執(zhí)行CHAIN,例如:
begin
dbms_scheduler.create_job(job_name => 'chainjob1',
job_type => 'CHAIN',
job_action => 'mychain1',
repeat_interval => 'freq=daily: interval=1',
enabled => true);
end;
然后,管理員或者創(chuàng)建者就可以通過定期觀察*_scheduler_job_run_details視圖來確認(rèn)chain的執(zhí)行情況了。
到此,相信大家對“Oracle調(diào)度Schedule特性chains分析”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!