循环SQL节点可循环生成SQL语句,再将其分批提交给DMS管理的任意关系型数据库执行,同时,还可以搭配变量,控制SQL循环次数,达到简化SQL循环逻辑、平衡SQL语句对源库产生压力的目的。本文介绍配置循环SQL节点的操作步骤。
背景信息
任务编排的单实例SQL节点,仅可在数据库中单次执行SQL语句,不适用需要循环执行重复逻辑的场景,如:删除冗余的数据库表、SaaS用户更新大量表等场景。循环SQL节点适用于循环执行重复逻辑的场景。
例如:删除数据库表中冗余的数据。
在循环SQL节点配置页中编写简单的SQL语句,并且使用节点的循环下标${loop.index}、循环次数来控制SQL循环次数。不需要编写复杂的while、loop等循环语句就可以控制循环次数,实现循环执行删除数据库表数据的操作。
DELETE FROM test WHERE id=${loop.index};
操作步骤
- 登录数据管理DMS 5.0。
- 在顶部菜单栏中,选择 。
- 在任务流区域,单击目标任务流名称,进入任务流详情页。
- 在任务类型列表中,选择循环SQL节点并将其拖曳至画布空白区域。
- 双击循环SQL节点。
- 单击节点配置页右侧的变量设置页签,配置变量。
- 在循环SQL节点配置页,配置如下信息。
类别 配置项 说明 数据库 无 搜索并选择目标数据库。 说明- 您需要具有该数据库的查询、导出权限。申请权限的具体操作,请参见管理访问控制权限。
- 您可以单击界面右侧的元数据页签,查看该数据库中表的结构。
循环配置 循环类型 - 列表:可配置循环的列表、元素名、分隔符。具体的配置操作,请参见配置示例。说明
- 循环列表支持上游变量、任务流常量和赋值,同时支持组合使用,例如:
cat,dog,duck,${listStr}
。 - 分隔符用于分隔循环列表,支持正则表达式,默认为半角逗号
(,)
。 - 第一个循环列表的元素名默认为
loop.item
,第二个循环列表未配置元素名时,默认为loop.item1
,以此类推。SQL语句中可使用${loop.item1}
格式来获取当次循环对应的列表元素。 - 循环下标的变量名为
loop.index
,SQL中可使用${loop.index}
格式来获取当前循环下标。
- 循环列表支持上游变量、任务流常量和赋值,同时支持组合使用,例如:
- 迭代:可配置SQL循环次数。具体的配置操作,请参见配置示例。
循环列表 配置循环列表、元素名(可自定义)等信息。 您可单击循环列表区域上方的添加,添加多个循环列表。若存在多个循环列表,必须保障多个列表项元素分割后的长度一致,否则试运行会报错。
说明 若循环类型选择列表,则会出现此配置项。循环次数 SQL循环次数。 说明 若循环类型选择迭代,则会出现此配置项。执行配置 批次大小 将SQL语句循环次数尽可能等分,批次大小范围1~200。系统将每批次循环生成的SQL语句一次性提交给DMS执行。 例:批次大小为2,循环次数为7,SQL循环两次为一个批次,提交给DMS执行,分别提交4次,最后一次仅有一次循环。
批次执行间隔 每批次SQL任务执行的时间间隔(单位:秒),间隔取值范围0~180秒。 例:批次时间间隔为3秒,批次大小为2,循环次数为7,共有4个批次,有3个批次执行间隔,每段间隔时间为3秒。
- 在编写SQL区域,使用当前节点所选择的数据库的语法,编写SQL语句。系统将自动保存已编写的SQL语句。
- SQL预览:您可以在编写SQL代码的过程中,随时单击SQL预览,预览SQL代码。
- 有效性检查:编写完SQL代码后,单击有效性检查,检查SQL代码的有效性。
- 单击试运行。
- 如果执行日志的最后一行出现
status SUCCEEDED
,表明任务试运行成功。 - 如果执行日志的最后一行出现
status FAILED
,表明任务试运行失败。说明 如果试运行失败,在执行日志中查看执行失败的节点和原因,修改配置后重新尝试。
- 如果执行日志的最后一行出现
配置示例
说明 以下操作步骤中出现的数字均为示例值,仅供参考。
迭代
- 循环类型选择迭代。
- 循环次数填入7。
- 批次大小填入2。
- 批次执行间隔填入3。
- 在编写SQL区域写入SQL语句。
该SQL语句将实现删除test表中id为0、1、2、3、4、5、6的表数据,批次大小为2,该条SQL语句循环7次,分为4个批次提交给DMS执行,有3个批次执行间隔,间隔时间为3秒。
DELETE FROM test WHERE id=${loop.index};
- 单击试运行。
列表
- 循环类型选择列表。
- 添加循环列表,配置列表、元素名等信息。
- 批次大小填入2。
- 批次执行间隔填入3。
- 在编写SQL区域写入SQL语句。
该SQL语句可实现将设置的任务流常量值与上游变量值进行连接,作为name的值,获取的
${loop.index}
下标作为id,插入test表中。INSERT INTO test(id,name) VALUE(${loop.index}, concat('${key}','${key1}'));
- 单击试运行。