Mule传递数组至Oracle存储过程遇ORA-17059错误求助
解决Mule调用Oracle存储过程传递SYS.ODCIVARCHAR2LIST参数的ORA-17059错误
问题原因
直接传递Java原生数组([Ljava.lang.Object)时,Oracle JDBC驱动无法自动将其映射为SYS.ODCIVARCHAR2LIST类型,导致类型转换失败,触发ORA-17059错误。需要显式创建适配Oracle集合类型的数组对象。
解决方案
1. 修正数据库连接的类型映射
确保数据库配置中column-type的className指向Oracle的数组实现类,而非通用的java.sql.Array:
<db:config name="Database_Config" doc:name="Database Config"> <db:oracle-connection host="${bdd.host}" port="${bdd.port}" user="${bdd.user}" password="${secure::bdd.pwd}" serviceName="${bdd.serviceName}"> <db:column-types> <!-- 映射SYS.ODCIVARCHAR2LIST到Oracle的数组实现类 --> <db:column-type typeName="SYS.ODCIVARCHAR2LIST" className="oracle.sql.ARRAY" /> </db:column-types> </db:oracle-connection> </db:config>
2. 使用Mule Database模块的db::create-array函数生成适配数组
在存储过程的输入参数中,不要直接传递Java数组,而是用db::create-array函数将Java数组包装为Oracle兼容的SYS.ODCIVARCHAR2LIST实例:
<db:stored-procedure doc:name="Stored procedure" config-ref="Database_Config"> <db:sql><![CDATA[call HAG.REQ_PROC(:flow1,:flow2,:listArray)]]></db:sql> <db:input-parameters><![CDATA[#[{ "listArray": db::create-array('SYS.ODCIVARCHAR2LIST', array), "flow1" : string, "flow2": string }]]]></db:input-parameters> </db:stored-procedure>
关键说明
db::create-array函数第一个参数指定Oracle集合类型名(SYS.ODCIVARCHAR2LIST),第二个参数传入你的Java字符串数组变量。- 该函数会基于当前数据库连接生成对应数据库类型的数组对象,确保JDBC驱动能正确识别并转换为Oracle内部集合类型。
验证
如果你的array变量是类似['00000000000011', '00000000000022', '00000000000033']的字符串数组,修改后即可匹配官方PL/SQL示例中的v_list参数格式,成功调用存储过程。
内容的提问来源于stack exchange,提问作者Zayd Youmir
相关产品推荐
相关产品推荐

