Mule 4调用Oracle存储过程传递TABLE(UDT)参数报错如何解决?
根因分析
- 参数转换格式错误:当前所有入参、出参的DataWeave转换规则都配置为输出
application/json格式,Oracle自定义TABLE(UDT)类型的数组数据序列化后会被Mule 4 Database连接器识别为普通的LinkedHashMap对象,连接器默认只支持字符串、数字基础类型的自动转换,无法直接将JSON结构映射为Oracle UDT类型,因此触发类型转换错误。 - 缺少UDT类型声明:未给
p_lne_tbl参数显式指定UDT类型分类器,Mule Database连接器无法识别该参数需要映射为Oracle自定义类型,会默认尝试转换为字符串传入,和存储过程定义的TABLE类型不匹配,最终触发PLS-00306参数类型不匹配报错。
解决方案
按以下步骤调整配置即可解决:
- 统一参数转换输出格式:将所有参数(inputParameters、outputParameters、inOutParameters、query)的DataWeave转换输出格式改为
application/java,避免数据被JSON序列化丢失类型结构,示例改造后的inputParameters转换规则如下:
%dw 2.0 output application/java --- payload.inputParameters
- 为UDT参数添加类型分类器:修改inputParameters转换规则,单独为
p_lne_tbl参数指定Oracle UDT类型映射,替换示例中XXX_PKG.XX_INV_LINE_TBL为你实际在Oracle中定义的TABLE类型全限定名:
%dw 2.0 output application/java --- payload.inputParameters mapObject ((value, paramKey) -> if (paramKey ~= "p_lne_tbl") { (paramKey): { value: value, typeClassifier: { type: "ARRAY", structureName: "XXX_PKG.XX_INV_LINE_TBL" } } } else { (paramKey): value } )
- 嵌套UDT类型适配(可选):如果你的TABLE类型是嵌套了自定义OBJECT类型,还需要为数组内的每一行对象也指定对应的STRUCT类型映射,示例如下:
%dw 2.0 output application/java --- payload.inputParameters mapObject ((value, paramKey) -> if (paramKey ~= "p_lne_tbl") { (paramKey): { value: value map (lineItem) -> { value: lineItem, typeClassifier: { type: "STRUCT", structureName: "XXX_PKG.XX_INV_LINE_OBJ" // 替换为实际的OBJECT类型名 } }, typeClassifier: { type: "ARRAY", structureName: "XXX_PKG.XX_INV_LINE_TBL" } } } else { (paramKey): value } )
- JDBC驱动适配:确保使用的Oracle JDBC驱动版本为ojdbc8及以上,对UDT类型有完整的兼容支持。
内容的提问来源于stack exchange,提问作者Mayur Tripathi
相关产品推荐
相关产品推荐

