我的用例是查询一组表的数据并将其插入一个表中。所以我的nifi处理器基本上是这样的:
executeSql(数据集的查询集)>>> convertAvrotoJson >>>> convetJSONtoSQL(转换为insert语句)>>>> putSQL(插入语句)>>> executeSQL(删除与set中的第一个处理器查询关联的行表格)
问题出在最后一个executeSQL处理器上,当它不执行我的sql时,它会继续尝试运行putSQL查询。
为了测试(我在executeSQL中),我只用普通选择替换了我的删除查询:
这是executeSQL的数据来源,我们可以清楚地看到它仍然试图执行来自putSQL的insert语句,即使我已经指定要执行查询:
这是错误,错误清楚地表明我明确不希望它执行插入语句时我没有提供参数:
在表A中成功插入记录后如何在表B上执行删除语句?请帮助,因为即时通讯卡在此。请不要与图像混淆,因为我只是使用常规select测试它,以确保nifi可以正确执行我的查询。 我正在使用mysql 5.7
答案 0 :(得分:2)
如果流文件上有sql.args
个属性,ExecuteSQL将尝试使用它们来用参数填充PreparedStatement。这是因为指定的查询(无论是通过流文件主体还是通过SQL select query
属性进入)都可以具有?
参数,以用流文件属性来填充。对于上述流程,您可以在PutSQL和ExecuteSQL之间放置一个UpdateAttribute处理器,将Delete Attributes Expression
属性设置为sql\.args\..*
或类似的东西,以删除参数。
话虽如此,我建议您将整个流程替换为ExecuteSQL-> PutDatabaseRecord-> ExecuteSQL。这将绕过转换逻辑,并且SQL生成/执行在内部完成(因此不需要sql.args
属性)。