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

升级ojdbc8后,如何用java.sql.Struct替代oracle.sql.STRUCT适配MutableStruct?

解决方案

临时过渡方案(兼容现有代码)

虽然oracle.sql.STRUCT已被标记为弃用,但在ojdbc8中该类仍存在且可正常运行。如果你的java.sql.Struct实例是Oracle JDBC驱动的实现类(通常为oracle.jdbc.OracleStruct,它继承自oracle.sql.STRUCT),可直接向下转型适配MutableStruct构造器:

java.sql.Struct standardStruct = <从JDBC操作获取的标准Struct实例>;
MutableStruct struct = new MutableStruct((oracle.sql.STRUCT) standardStruct, sqlType, factory);

注意:该方案仅作临时过渡,Oracle未来版本可能移除oracle.sql.STRUCT,需尽快迁移至标准JDBC实现。

长期替代方案(彻底弃用Oracle专有类)

1. 重新用JPublisher生成适配ojdbc8的代码

JPublisher在ojdbc8环境下可生成基于标准JDBC API(java.sql.Struct)的代码,无需依赖oracle.sql.STRUCT和MutableStruct。重新生成步骤:

  • 确保JPublisher使用ojdbc8.jar及配套工具包
  • 执行JPublisher命令时指定标准JDBC兼容参数,示例:
    jpub -user=用户名/密码 -sql=你的PLSQL包名 -usertypes=jdbc -methods=all
    
    其中-usertypes=jdbc参数会让JPublisher生成基于标准JDBC类型的映射代码,替代原有Oracle专有类型。

2. 自定义Struct包装类替代MutableStruct

若无法重新生成代码,可自定义类封装java.sql.Struct,实现MutableStruct的核心功能:

import java.sql.Struct;
import java.sql.SQLException;

public class StandardMutableStruct {
    private Struct underlyingStruct;
    private int[] sqlTypes;

    public StandardMutableStruct(Struct struct, int[] sqlTypes) throws SQLException {
        this.underlyingStruct = struct;
        this.sqlTypes = sqlTypes;
        // 参考原MutableStruct的初始化逻辑补充
    }

    // 实现原MutableStruct的属性操作方法
    public Object getAttribute(int index) throws SQLException {
        return underlyingStruct.getAttributes()[index];
    }

    // 根据业务需求添加其他方法...
}

之后将原有代码中的MutableStruct替换为自定义的StandardMutableStruct,并修改构造参数为java.sql.Struct。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:08:36