动态使用Java字符串和ResultSet对象

动态使用Java字符串和ResultSet对象,java,resultset,Java,Resultset,我想从数据库表A获取数据,并创建一个insert语句来加载表B。 为了保留数据类型,我使用ResultSet方法创建了一个一次性stamant,从表a中读取,如下所示 在表中插入值 (rs.getString(1)、rs.getInt(3)、rs.getString(5)、rs.getInt(6)、rs.getString(7)、rs.getInt(8)、rs.getString(9)、rs.getInt(10)、rs.getString(11)、rs.getInt(13)、rs.getStri

我想从数据库表A获取数据,并创建一个insert语句来加载表B。 为了保留数据类型,我使用ResultSet方法创建了一个一次性stamant,从表a中读取,如下所示

在表中插入值 (rs.getString(1)、rs.getInt(3)、rs.getString(5)、rs.getInt(6)、rs.getString(7)、rs.getInt(8)、rs.getString(9)、rs.getInt(10)、rs.getString(11)、rs.getInt(13)、rs.getString(16))

我的下一步是迭代表A中的记录,并将这些insert语句作为批处理发送到表B。但是如何在循环
rs.next()
时用实际值替换字符串
(rs.getString(1)和rs.getInt(3)…


Bu当您可以使用一个SQL命令从一个表插入到另一个表时,为什么还要麻烦呢:

您需要使用占位符为插入创建
PreparedStatement

PreparedStatement insert = connection.prepareStatement("INSERT INTO TABLE_B VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
while (rs.next()) {
  insert.setString(1, rs.getString(1)); 
  insert.setInt(2, rs.getInt(3));   
  insert.setString(3, rs.getString(5));  
  insert.setInt(4, rs.getInt(6)); 
  insert.setString(5, rs.getString(7)); 
  insert.setInt(6, rs.getInt(8)); 
  insert.setString(7, rs.getString(9)); 
  insert.setInt(8, rs.getInt(10)); 
  insert.setString(9, rs.getString(11));
  insert.setInt(10, rs.getInt(13)); 
  insert.setString(11, rs.getString(16));
  insert.addBatch();
  // call insert.executeBatch() once you accumulate enough records for insert
}
如果目标表中的列类型与源表中使用的列类型匹配,则可以使用
ResultSetMetaData
PreparedStatement

  ResultSetMetaData md = rs.getMetaData();
  while (rs.next()) {
  for (int m = 1; m <= md.getColumnCount(); m++) {
            if (rs.getObject(m) == null) {
                targetStatement.setNull(m, md.getColumnType(m));
            } else if (md.getColumnType(m) == OracleTypes.VARCHAR) {
                targetStatement.setString(m, rs.getString(m));
            } else if (md.getColumnType(m) == OracleTypes.NUMBER) {
                targetStatement.setDouble(m, rs.getDouble(m));
            } else if (md.getColumnType(m) == OracleTypes.CHAR) {
                targetStatement.setString(m, rs.getString(m));
            } else if (md.getColumnType(m) == OracleTypes.TIMESTAMP) {
                targetStatement.setTimestamp(m, rs.getTimestamp(m));
            } else if (md.getColumnType(m) == OracleTypes.DATE) {
                targetStatement.setDate(m, rs.getDate(m));
            } else {
                targetStatement.setString(m, rs.getString(m));
            }
  }
  insert.addBatch();
  // call insert.executeBatch() once you accumulate enough records for insert
}
ResultSetMetaData md=rs.getMetaData();
while(rs.next()){

对于(int m=1;m首先尝试在单个语句中完成所有操作

INSERT INTO xtable (x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11)
(SELECT y1, y3, y5, y6, y7, y8, y9, y10, y11, y13, y16
 FROM ytable
 WHERE ...) 

否则,请使用@Ivan的PreparedStatement。

很高兴看到您的响应。我编写了一个通用代码,而不是硬编码,因为表名将作为参数传递。Diff表可能包含不同的COL。使用
ResultSetMetaData
更新,以使构建
PreparedStatement
更容易在他的案例中,源表中的SELECT语句的列应该与插入目标表中的列相同。并且您可能需要一个包装器类,该类将根据源表名称生成不同的
PreparedStatement
s。谢谢Mark。它们位于两个不同的数据库中。谢谢Joop。是的,尽管PreparedStatement在没有记录的情况下进行大量迭代。
INSERT INTO xtable (x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11)
(SELECT y1, y3, y5, y6, y7, y8, y9, y10, y11, y13, y16
 FROM ytable
 WHERE ...)