共計 4933 個字符,預計需要花費 13 分鐘才能閱讀完成。
本篇內容主要講解“Oracle 調度 Schedule 特性 chains 分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓丸趣 TV 小編來帶大家學習“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 分析”有了更深的了解,不妨來實際操作一番吧!這里是丸趣 TV 網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!