如何向oracle数据库插入大量数据?

如何向oracle数据库插入大量数据?,oracle,insert,Oracle,Insert,首先我从用户A查询一些数据,然后我需要将所有这些数据插入到oracle中的用户B用户,我的意思是,我使用Java来解决它。下面是我的代码: while (ds.getResultSet().next()) { ResultSet resultSet = ds.getResultSet(); ResultSetMetaData metaData = resultSet.getMetaData(); int count = metaData.getColumnCount();

首先我从用户A查询一些数据,然后我需要将所有这些数据插入到oracle中的用户B用户,我的意思是,我使用Java来解决它。下面是我的代码:

while (ds.getResultSet().next()) {
    ResultSet resultSet = ds.getResultSet();
    ResultSetMetaData metaData = resultSet.getMetaData();
    int count = metaData.getColumnCount();
    StringBuilder sb = new StringBuilder();
    sb.append("insert into ");
    sb.append(tableName.toUpperCase());
    sb.append("(");
    for (int i = 1; i <= count; i++) {
        sb.append(metaData.getColumnName(i));
        if (i != count) sb.append(",");
        else sb.append(")");
    }
    sb.append(" values(");
    for (int i = 1; i <= count; i++) {
        Object colValue = resultSet.getObject(i);
        if (colValue == null) {
            sb.append("null");
        } else {
            if (colValue instanceof Date) {
                Date d = resultSet.getDate(i);
                String dateStr = DateUtils.formatDate(d, "yyyy-MM-dd hh:mm:ss");
                sb.append("to_date(");
                sb.append("'");
                sb.append(dateStr);
                sb.append("','yyyy-MM-dd hh24:mi:ss')");
            } else {
                sb.append("'");
                sb.append(resultSet.getObject(i));
                sb.append("'");
            }
        }
        if (i != count) sb.append(",");
        else sb.append(")");
    }
    conn = datasource.getConnection();
    System.out.println(sb.toString());
    ps = conn.prepareStatement(sb.toString());
    ps.execute();
}
所以它可以工作一点,但当它插入80条以上的记录时,oracle就会崩溃,它在控制台中警告我:


你们能给我一些建议吗?谢谢您的时间。

不要使用Java,只需在Oracle中完成即可

INSERT INTO b.table_name ( col1, col2, col3, col4 )
  SELECT col1, col2, col3, col4
  FROM   a.table_name
  WHERE  some_column = some_value; -- Add filters if necessary
您不必通过解析元数据来动态构建查询。 避免了不转义单引号的错误。 除此之外,您还可以避免潜在的SQL注入攻击,用户可以在其中输入字符串值、从userid='Admin1'的用户中选择密码\u散列-
正如你们所建议的,我对代码做了如下更改:

Connection conn = DriverManager.getConnection(url, user, pwd);         
PreparedStatement pspt = conn.prepareStatement("select * from SYS_DICT_TYPE");
ResultSet resultSet = pspt.executeQuery();                                    
ResultSetMetaData metaData = resultSet.getMetaData();                         
int columnCount = metaData.getColumnCount();                                  
StringBuilder sql = new StringBuilder();                                      
sql.append("insert into TEST_SYS (");                                         
for (int i = 1; i <= columnCount; i++) {                                      
    sql.append(metaData.getColumnName(i));                                    
    if (i != columnCount) sql.append(",");                                    
}                                                                             
sql.append(") values(");                                                      
for (int i = 1; i <= columnCount; i++) {                                      
    sql.append("?");                                                          
    if (i != columnCount) sql.append(",");                                    
}                                                                             
sql.append(")");                                                              
String s = sql.toString();                                                    

PreparedStatement pspt2 = conn.prepareStatement(s);                           
while (resultSet.next()) {                                                    
    for (int i = 1; i <= columnCount; i++) {                                  
        pspt2.setObject(i, resultSet.getObject(i));                           
    }                                                                         
    pspt2.addBatch();                                                         
}                                                                             
pspt2.executeBatch(); 
连线的事情是:首先,我构建一个以“;”结尾的语句 sql子句应该像插入tablename值?,?;
这导致ora-00933:SQL错误。当我删除“;”时它工作得非常好。为什么会发生这种情况

我不知道错误消息,但除非您需要修改来自Java的数据,否则最好使用insert将数据移动到数据库中的目标_表c1、c2、c3从源_表中选择c1、c2、c3;一个干净的解决方案是:1在包DB中创建一个过程,它接受一个自定义类型参数作为表类型并插入数据;2在java中创建一个二维数组,根据您创建的表类型google up class StructDescriptor 3使用值填充该数组4调用该过程。关闭您的结果集和准备好的语句!这可能会解决坠机问题。但正如其他人所说,没有理由在Java中这样做。如果您真的想在Java中执行,请使用bind变量并反复执行相同的prepared语句。看起来您正在使用文本值而不是绑定从头开始为每个记录构建一个新的insert语句,并让Oracle对其进行解析、优化和缓存,并在每次执行时建立一个新的数据库连接。我不懂Java,但肯定没有人会从头开始为大型数据集中的每一行构建和编译Java方法。难道没有办法编写可重用的代码吗?