Java 使用不同的实现在另一个Clob中复制Clob

Java 使用不同的实现在另一个Clob中复制Clob,java,jdbc,clob,Java,Jdbc,Clob,在我的公司,我们正在执行数据库迁移。由于许多原因,我们无法使用数据库迁移工具,因此我们必须开发迁移工具,将某些特定表中包含的所有行从一个数据库复制到另一个数据库。我们开发了一个使用JDBC的多数据库工具。目前,我们正在从DB2迁移到Oracle,中间步骤是H2。相同的表有一个Clob列。当我们将此列从DB2导出到H2时,不会出现任何错误或问题,但当我们尝试使用JDBC将Clob从H2复制到Oracle时,会出现以下异常: ClassCastException: cannot cast from

在我的公司,我们正在执行数据库迁移。由于许多原因,我们无法使用数据库迁移工具,因此我们必须开发迁移工具,将某些特定表中包含的所有行从一个数据库复制到另一个数据库。我们开发了一个使用JDBC的多数据库工具。目前,我们正在从DB2迁移到Oracle,中间步骤是H2。相同的表有一个Clob列。当我们将此列从DB2导出到H2时,不会出现任何错误或问题,但当我们尝试使用JDBC将Clob从H2复制到Oracle时,会出现以下异常:

ClassCastException: cannot cast from org.h2.jdbc.JdbcClob to oracle.jdbc.Clob
有没有一种方法或程序来执行这种转换?类似于不同Clob类型中的ClobCopy实用程序?不幸的是,我们只能使用Java和Jdbc来完成这项任务,由于客户的规范,没有JPA或DB迁移工具

这是我试图做的一个例子:

public class CopyTable {

    public void doCopy(){
        Connection h2 = getH2Connection(); //suppose this exists and works
        Connection oracle = getOracleConnection(); //suppose this exists and works

        String sqlSelect = "select * from tabletoexport";
        String sqlInsert = "insert into tabletofill(ID, DATA) values (?,?)";

        PreparedStatement select = h2.prepareStatement(sqlSelect);
        PreparedStatement insert = oracle.prepareStatement(sqlInsert);
        ResultSet rs = select.executeQuery();
        while (rs.next()){
            insert.setLong(1, rs.getLong("ID"));
            insert.setClob(2, rs.getClob("DATA")); //this throws an exception
            insert.executeUpdate();
        }

    }

}
接口有一个返回
读取器
的方法,接口有一个接受
读取器
的方法。要使副本正常工作,您所需要做的就是使用这些方法

换句话说,替换该行

    insert.setClob(2, rs.getClob("DATA")); //this throws an exception


至于为什么从DB/2导入到H2没有抱怨,可能H2 JDBC驱动程序没有假设传入
Clob
setClob
值来自H2,但Oracle JDBC驱动程序确实假设以相同方式传入的
Clob
值来自Oracle。但是,Oracle JDBC不能合理地对
读取器
做出任何此类假设,由于这些可能来自任何地方

请回答您的问题,并添加用于复制CLOB的Java代码,以将其转换为一个CLOB,您可以同时获得CLOB的读写器…@Powerlord这可以让我复制CLOB吗?@lore-您是否担心不想将每个CLOB值完全读取到内存中,或者这是一个可以接受的解决方案?@Powerlord这可能是一个可行的解决方案。目前我们正在评估所有的可能性。好吧,这可以解决我们的问题。而且,这似乎是一个非常干净的解决方案。明天我们会试试这个。非常感谢你的帮助。
    insert.setClob(2, rs.getClob("DATA").getCharacterStream());