从Java向Oracle 19c传递ODCIVARCHAR2LIST报错17023的解决咨询
错误原因与解决方案
错误原因
- 你碰到的
17023错误,核心问题是JDBC标准的createArrayOf方法不支持Oracle的特定集合类型SYS.ODCIVARCHAR2LIST。createArrayOf是为SQL标准数组设计的API,而SYS.ODCIVARCHAR2LIST是Oracle自带的非标准集合类型,两者不兼容,所以调用时会抛出“不支持的特性”错误。
解决方案(无需修改数据库代码)
只需调整Java代码,使用Oracle JDBC驱动提供的专属API来创建匹配的数组对象:
- 将JDBC的
Connection对象转换为Oracle专属的OracleConnection(需确保项目引入了Oracle JDBC驱动包,如ojdbc8.jar); - 使用
createOracleArray方法,传入Oracle集合类型名SYS.ODCIVARCHAR2LIST和你的字符串数组。
修改后的Java代码如下:
public int acceptsGoodsInDepots(String userId, String[] ids) throws SQLException { int insertedCount = 0; try (Connection connection = JDBCPoolConnectionAPI.getPoolConnection().getConnection(); CallableStatement callableStatement = connection.prepareCall("{call change_trace_goods_for_aceepts(?, ?, ?)}")) { callableStatement.setString(1, userId); // 转换为OracleConnection并创建对应类型的数组 OracleConnection oracleConn = connection.unwrap(OracleConnection.class); Array serialArray = oracleConn.createOracleArray("SYS.ODCIVARCHAR2LIST", ids); callableStatement.setArray(2, serialArray); callableStatement.registerOutParameter(3, Types.INTEGER); callableStatement.execute(); insertedCount = callableStatement.getInt(3); } return insertedCount; }
补充说明
- 使用
unwrap方法而非直接强制类型转换,是JDBC 4.0及以上版本推荐的标准方式,兼容性和安全性更好; - 必须确保项目依赖中包含正确版本的Oracle JDBC驱动,否则会找不到
OracleConnection类。
内容的提问来源于stack exchange,提问作者S.kh
相关产品推荐
相关产品推荐

