You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 16:33:23