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
相关产品推荐
相关产品推荐

