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

Spring JDBC调用PL/SQL存储过程传递字符串数组报错求助

解决Spring SimpleJdbcCall传递Oracle自定义数组类型时的转换异常

这个问题我之前也踩过坑,核心原因是Java集合无法被Spring JDBC自动转换为Oracle原生的ARRAY对象,另外还有可能是自定义类型名称的大小写不匹配(Oracle默认会把标识符转为大写存储)。下面是具体的解决方案:

1. 修正自定义类型名称的大小写匹配

你创建的PL/SQL类型是arrayOfVchr,但Oracle会自动将其转为大写的ARRAYOFVCHR存储。所以在声明参数时,必须使用大写的类型名,否则Spring找不到对应的Oracle类型:

sp.declareParameters(new SqlParameter("v_array", OracleTypes.ARRAY, "ARRAYOFVCHR"));

2. 手动将Java List转换为Oracle ARRAY对象

Spring的SimpleJdbcCall不会自动帮你把List转成Oracle的ARRAY,你需要借助原生的OracleConnection来创建对应的ARRAY实例:

完整可运行代码示例

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.setResultsMapCaseInsensitive(true);
SimpleJdbcCall sp = new SimpleJdbcCall(jdbcTemplate)
        .withProcedureName("你的存储过程名称") // 替换为实际的存储过程名
        .declareParameters(new SqlParameter("v_array", OracleTypes.ARRAY, "ARRAYOFVCHR"));

// 准备要传递的字符串列表
List<String> list = Arrays.asList("test1", "test2", "test3");
Map<String, Object> paramMap = new HashMap<>();

try (Connection conn = jdbcTemplate.getDataSource().getConnection();
     OracleConnection oracleConn = conn.unwrap(OracleConnection.class)) {
    // 创建Oracle原生ARRAY对象
    ARRAY oracleArray = oracleConn.createARRAY("ARRAYOFVCHR", list.toArray());
    paramMap.put("v_array", oracleArray);
    
    // 执行存储过程
    sp.execute(paramMap);
} catch (SQLException e) {
    // 根据业务需求处理异常
    e.printStackTrace();
}

3. 额外检查点

  • 确认存储过程的参数类型确实是大写的ARRAYOFVCHR,比如存储过程定义应该是:
    CREATE OR REPLACE PROCEDURE target_procedure(v_array IN ARRAYOFVCHR) IS
    BEGIN
        -- 你的存储过程业务逻辑
    END;
    
  • 检查ojdbc驱动版本是否和Oracle数据库版本兼容,比如Oracle 12c+建议使用ojdbc8及以上版本。

内容的提问来源于stack exchange,提问作者Emil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:12:52