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

从Java向Oracle 19c传递ODCIVARCHAR2LIST报错17023的解决咨询

错误原因与解决方案

错误原因

  • 你碰到的17023错误,核心问题是JDBC标准的createArrayOf方法不支持Oracle的特定集合类型SYS.ODCIVARCHAR2LIST。createArrayOf是为SQL标准数组设计的API,而SYS.ODCIVARCHAR2LIST是Oracle自带的非标准集合类型,两者不兼容,所以调用时会抛出“不支持的特性”错误。

解决方案(无需修改数据库代码)

只需调整Java代码,使用Oracle JDBC驱动提供的专属API来创建匹配的数组对象:

  1. 将JDBC的Connection对象转换为Oracle专属的OracleConnection(需确保项目引入了Oracle JDBC驱动包,如ojdbc8.jar);
  2. 使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 08:19:49