通过Data Factory更新Oracle表时报错但数据实际已更新问题咨询
根本原因
Azure Data Factory 的Lookup活动的设计定位是读取查询结果,默认要求执行的语句必须返回至少1行数据。你执行的是UPDATE这类DML语句,Oracle执行完成后默认不会返回结果集,因此Lookup活动检测不到返回数据触发报错,但DML语句本身已经执行完成且提交,所以目标表数据已经更新。
解决思路
- 方案1:更换更适配的活动执行更新操作
不要使用Lookup做DML写操作,替换为以下更合适的方案:- 使用复制活动的「前置脚本」配置项,把UPDATE语句写在前置脚本中,复制活动本身可以配置为空查询逻辑
- 把更新逻辑封装为Oracle存储过程,在ADF中使用存储过程活动调用
- 方案2:改造现有SQL语句适配Lookup规则
如果需要保留现有Lookup的使用方式,在UPDATE语句末尾新增返回结果的查询语句,确保执行后返回至少1行数据,Oracle环境示例如下:
如果需要获取更新的行数,可以扩展为:-- 你的原有更新语句 UPDATE 目标表 SET 字段1=更新值 WHERE 过滤条件; -- 新增返回行的查询 SELECT 1 AS exec_success FROM DUAL;DECLARE updated_row_count NUMBER; BEGIN UPDATE 目标表 SET 字段1=更新值 WHERE 过滤条件; updated_row_count := SQL%ROWCOUNT; -- 返回更新行数给Lookup SELECT updated_row_count AS update_count FROM DUAL; END; - 方案3:调整Lookup活动的容错配置
如果不需要获取更新的返回结果,可以在Lookup活动的「设置」页开启仅查询第一行,同时配置活动的错误容错规则,忽略「未返回结果」类的错误,该方案不推荐,会掩盖其他真正的执行异常。
内容的提问来源于stack exchange,提问作者willy sepulveda
相关产品推荐
相关产品推荐

