配置循環(huán)SQL節(jié)點(diǎn)
循環(huán)SQL節(jié)點(diǎn)可循環(huán)生成SQL語句,再將其分批提交給DMS管理的任意關(guān)系型數(shù)據(jù)庫執(zhí)行,同時(shí),還可以搭配變量,控制SQL循環(huán)次數(shù),達(dá)到簡化SQL循環(huán)邏輯、平衡SQL語句對(duì)源庫產(chǎn)生壓力的目的。本文介紹配置循環(huán)SQL節(jié)點(diǎn)的操作步驟。
背景信息
任務(wù)編排的單實(shí)例SQL節(jié)點(diǎn),僅可在數(shù)據(jù)庫中單次執(zhí)行SQL語句,不適用需要循環(huán)執(zhí)行重復(fù)邏輯的場(chǎng)景,如:刪除冗余的數(shù)據(jù)庫表、SaaS用戶更新大量表等場(chǎng)景。循環(huán)SQL節(jié)點(diǎn)適用于循環(huán)執(zhí)行重復(fù)邏輯的場(chǎng)景。
例如:刪除數(shù)據(jù)庫表中冗余的數(shù)據(jù)。
在循環(huán)SQL節(jié)點(diǎn)配置頁中編寫簡單的SQL語句,并且使用節(jié)點(diǎn)的循環(huán)下標(biāo)${loop.index}、循環(huán)次數(shù)來控制SQL循環(huán)次數(shù)。不需要編寫復(fù)雜的while、loop等循環(huán)語句就可以控制循環(huán)次數(shù),實(shí)現(xiàn)循環(huán)執(zhí)行刪除數(shù)據(jù)庫表數(shù)據(jù)的操作。
DELETE FROM test WHERE id=${loop.index};
操作步驟
- 登錄數(shù)據(jù)管理DMS 5.0。
在頂部菜單欄中,選擇 。
說明若您使用的是極簡模式的控制臺(tái),請(qǐng)單擊控制臺(tái)左上角的圖標(biāo),選擇
。在任務(wù)流區(qū)域,單擊目標(biāo)任務(wù)流名稱,進(jìn)入任務(wù)流詳情頁。
在任務(wù)類型列表中,選擇循環(huán)SQL節(jié)點(diǎn)并將其拖曳至畫布空白區(qū)域。
雙擊循環(huán)SQL節(jié)點(diǎn)。
單擊節(jié)點(diǎn)配置頁右側(cè)的變量設(shè)置頁簽,配置變量。
說明您可以單擊變量設(shè)置區(qū)域右上角的,查看配置變量的提示信息。
單擊節(jié)點(diǎn)變量頁簽,配置節(jié)點(diǎn)變量。配置方法,請(qǐng)參見配置時(shí)間變量。
單擊任務(wù)流常量頁簽,配置任務(wù)流常量。任務(wù)流常量為固定值,在所有節(jié)點(diǎn)中都可使用,在SQL中的使用格式為
${name}
。單擊任務(wù)流變量頁簽,配置任務(wù)流變量。配置方法,請(qǐng)參見配置時(shí)間變量。
單擊輸入變量頁簽,查看輸入變量。
在循環(huán)SQL節(jié)點(diǎn)配置頁,配置如下信息。
類別
配置項(xiàng)
說明
數(shù)據(jù)庫
無
搜索并選擇目標(biāo)數(shù)據(jù)庫。
說明您需要具有該數(shù)據(jù)庫的查詢、導(dǎo)出權(quán)限。申請(qǐng)權(quán)限的具體操作,請(qǐng)參見管理訪問控制權(quán)限。
您可以單擊界面右側(cè)的元數(shù)據(jù)頁簽,查看該數(shù)據(jù)庫中表的結(jié)構(gòu)。
循環(huán)配置
循環(huán)類型
列表:可配置循環(huán)的列表、元素名、分隔符。具體的配置操作,請(qǐng)參見配置示例。
說明循環(huán)列表支持上游變量、任務(wù)流常量和賦值,同時(shí)支持組合使用,例如:
cat,dog,duck,${listStr}
。分隔符用于分隔循環(huán)列表,支持正則表達(dá)式,默認(rèn)為半角逗號(hào)
(,)
。第一個(gè)循環(huán)列表的元素名默認(rèn)為
loop.item
,第二個(gè)循環(huán)列表未配置元素名時(shí),默認(rèn)為loop.item1
,以此類推。SQL語句中可使用${loop.item1}
格式來獲取當(dāng)次循環(huán)對(duì)應(yīng)的列表元素。循環(huán)下標(biāo)的變量名為
loop.index
,SQL中可使用${loop.index}
格式來獲取當(dāng)前循環(huán)下標(biāo)。
迭代:可配置SQL循環(huán)次數(shù)。具體的配置操作,請(qǐng)參見配置示例。
循環(huán)列表
配置循環(huán)列表、元素名(可自定義)等信息。
您可單擊循環(huán)列表區(qū)域上方的添加,添加多個(gè)循環(huán)列表。若存在多個(gè)循環(huán)列表,必須保障多個(gè)列表項(xiàng)元素分割后的長度一致,否則試運(yùn)行會(huì)報(bào)錯(cuò)。
說明若循環(huán)類型選擇列表,則會(huì)出現(xiàn)此配置項(xiàng)。
循環(huán)次數(shù)
SQL循環(huán)次數(shù)。循環(huán)次數(shù)范圍1~100。
說明若循環(huán)類型選擇迭代,則會(huì)出現(xiàn)此配置項(xiàng)。
執(zhí)行配置
批次大小
將SQL語句循環(huán)次數(shù)盡可能等分,批次大小范圍1~200。系統(tǒng)將每批次循環(huán)生成的SQL語句一次性提交給DMS執(zhí)行。
例:批次大小為2,循環(huán)次數(shù)為7,SQL循環(huán)兩次為一個(gè)批次,提交給DMS執(zhí)行,分別提交4次,最后一次僅有一次循環(huán)。
批次執(zhí)行間隔
每批次SQL任務(wù)執(zhí)行的時(shí)間間隔(單位:秒),間隔取值范圍0~180秒。
例:批次時(shí)間間隔為3秒,批次大小為2,循環(huán)次數(shù)為7,共有4個(gè)批次,有3個(gè)批次執(zhí)行間隔,每段間隔時(shí)間為3秒。
說明批次執(zhí)行間隔作用于上一批次任務(wù)執(zhí)行成功后。
SQL任務(wù)按照批次順序執(zhí)行,若上一批次任務(wù)執(zhí)行失敗,則后續(xù)批次的任務(wù)不會(huì)被執(zhí)行。
在編寫SQL區(qū)域,使用當(dāng)前節(jié)點(diǎn)所選擇的數(shù)據(jù)庫的語法,編寫SQL語句。系統(tǒng)將自動(dòng)保存已編寫的SQL語句。
SQL預(yù)覽:您可以在編寫SQL代碼的過程中,隨時(shí)單擊SQL預(yù)覽,預(yù)覽SQL代碼。
有效性檢查:編寫完SQL代碼后,單擊有效性檢查,檢查SQL代碼的有效性。
單擊試運(yùn)行。
如果執(zhí)行日志的最后一行出現(xiàn)
status SUCCEEDED
,表明任務(wù)試運(yùn)行成功。如果執(zhí)行日志的最后一行出現(xiàn)
status FAILED
,表明任務(wù)試運(yùn)行失敗。說明如果試運(yùn)行失敗,在執(zhí)行日志中查看執(zhí)行失敗的節(jié)點(diǎn)和原因,修改配置后重新嘗試。
配置示例
以下操作步驟中出現(xiàn)的數(shù)字均為示例值,僅供參考。
迭代
循環(huán)類型選擇迭代。
循環(huán)次數(shù)填入7。
批次大小填入2。
批次執(zhí)行間隔填入3。
在編寫SQL區(qū)域?qū)懭隨QL語句。
該SQL語句將實(shí)現(xiàn)刪除test表中id為0、1、2、3、4、5、6的表數(shù)據(jù),批次大小為2,該條SQL語句循環(huán)7次,分為4個(gè)批次提交給DMS執(zhí)行,有3個(gè)批次執(zhí)行間隔,間隔時(shí)間為3秒。
DELETE FROM test WHERE id=${loop.index};
單擊試運(yùn)行。
列表
循環(huán)類型選擇列表。
添加循環(huán)列表,配置列表、元素名等信息。
單擊界面右側(cè)的變量設(shè)置頁簽,配置任務(wù)流常量和上游變量。
任務(wù)流常量配置
鍵名:
looplist0
鍵值:
task1
本示例中上游變量名為
looplist1
,值為“小白”。上游變量的配置,請(qǐng)參見配置時(shí)間變量。在循環(huán)列表中填入列表名
${looplist0}
、元素名key
,列表名為${looplist1}
、元素名為key1
。說明若未設(shè)置元素名稱,則默認(rèn)為系統(tǒng)配置的元素名稱。
若該循環(huán)SQL節(jié)點(diǎn)有上游節(jié)點(diǎn),且配置了輸出變量,也可將已有的上游變量添加至循環(huán)列表。
必須保障多個(gè)列表項(xiàng)元素分割后,列表的長度一致,否則試運(yùn)行會(huì)報(bào)錯(cuò)。
批次大小填入2。
批次執(zhí)行間隔填入3。
在編寫SQL區(qū)域?qū)懭隨QL語句。
該SQL語句可實(shí)現(xiàn)將設(shè)置的任務(wù)流常量值與上游變量值進(jìn)行連接,作為name的值,獲取的
${loop.index}
下標(biāo)作為id,插入test表中。INSERT INTO test(id,name) VALUE(${loop.index}, concat('${key}','${key1}'));
單擊試運(yùn)行。