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