您好,登錄后才能下訂單哦!
本篇內容主要講解“Oracle調度Schedule特性chains分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Oracle調度Schedule特性chains分析”吧!
舉個簡單的例子:運行PROGRAM:A以及PROGRAM:B,
如果成功的話繼續運行PROGRAM:C,否則的話運行PROGRAM:D。Programs:A、B、C、D以及執行的邏輯關系就構成了一個最簡單的CHAIN。
CHAIN的管理操作比較多:創建/刪除/修改Chains,添加/修改/刪除Chain Steps等等。
1、創建Chains
創建CHAIN使用DBMS_SCHEDULER.CREATE_CHAIN過程,這個過程調用非常簡單,因為需要指定的參數極少
在創建Chain時,甚至可以簡單到只指定一個CHAIN的名稱,其它均為空即可
begin
dbms_scheduler.create_chain('mychain1');
end;
創建好的Chains,可以通過*_SCHEDULER_CHAINS視圖查看,例如:
SQL> select chain_name from user_scheduler_chains;
CHAIN_NAME
----------------
MYCHAIN1
注意,創建了CHAIN是遠遠不夠的,只有一個CHAIN對象ORACLE還是啥也干不了(當然啦,相信從上面執行的創建語句大家也看出來了),
CHAIN對象創建之后,要做的工作其實才剛剛開始。其后,還需要定義Chain Steps以及Chain rules。
2、創建Chain Step
Chain Steps 就是用來指定CHAIN執行的操作及執行步驟,創建CHAIN STEP是通過DBMS_SCHEDULER.DEFINE_CHAIN_STEP過程進行
為剛剛創建的mychain1添加一個step
begin
dbms_scheduler.define_chain_step(chain_name => 'mychain1',
step_name => 'mystep1',
program_name => 'myprogram1');
end;
Chain Steps 即可以調用PROGRAM(注意是program,不是procedure,當然program中可以定義執行procedure),也可以調用EVENT,甚至調用其它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、創建Chain Rule
接下來,要為CHAIN的運行定義規則。定義規則是使用DBMS_SCHEDULER.DEFINE_CHAIN_RULE過程,Chain Rules依賴于Chain Steps,
每個CHAIN RULE都擁有condition和action屬性,當滿足condition時則執行action中指定的step。
舉個例子:創建CHAIN RULE,首先執行mystep1,如果mystep1成功執行的話,就繼續執行mystep2,如果mystep2也成功執行的話,則結束該CHAIN,創建腳本如下
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兩個參數。在為CONDITION參數指定值時,其語法看起來稍稍復雜一些,或者說是靈活,CONDITION參數值支持下列的語法形式:
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參數值如下:
'step1 completed'
Action 參數相對簡單一些,這個參數用來指定當滿足condition參數時,CHAIN執行的操作。
4、運行Chains
最后,來運行一下創建的mychain1吧,手動運行CHAIN是通過DBMS_SCHEDULER.RUN_CHAIN過程
begin
dbms_scheduler.run_chain(chain_name => 'mychain1',
start_steps => 'mystep1');
end;
這個語句執行可能會報錯呦,注意往下看
語句執行成功,查看一下執行的結果。我們之前定義的myprogram1等program對象,實際上是調用procedure,向一個指定表test中插入記錄,這里直接查詢一下該表,就知道執行情況了(在此之前,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表中有了兩條記錄,對應前面設置的CHAIN RULE,說明mystep1和mystep2均已正確執行。
提示:Chains在執行前,必須被置于enabled狀態,默認情況下剛剛創建的CHAIN都是disabled狀態,要修改Chains的狀態,
還是通過DBMS_SCHEDULER.ENABLE和DBMS_SCHEDULER.DISABLE兩過程
begin
dbms_scheduler.enable('mychain1');
end;
手動執行的CHAIN的話沒有系統級的日志記錄,因此如果希望看到詳細執行情況的話,可以創建job來執行CHAIN,例如:
begin
dbms_scheduler.create_job(job_name => 'chainjob1',
job_type => 'CHAIN',
job_action => 'mychain1',
repeat_interval => 'freq=daily: interval=1',
enabled => true);
end;
然后,管理員或者創建者就可以通過定期觀察*_scheduler_job_run_details視圖來確認chain的執行情況了。
到此,相信大家對“Oracle調度Schedule特性chains分析”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。