Как вставить огромное количество данных в базу данных Oracle? - PullRequest
0 голосов
/ 05 июня 2018

Сначала я запрашиваю некоторые данные у пользователя A, а затем мне нужно вставить все эти данные пользователю B (я имею в виду пользователя в oracle), и я использую 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 записей, оракул просто сжимается, и он предупреждает меня в консоли: console window

Можете ли вы дать мне несколько советов по этому поводу?Спасибо за ваше время.

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Как вы, ребята, предлагаете, я изменил свой код, как показано ниже:

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 должно выглядеть как insert into tablename values(?,?);), что вызывает ora-00933: ошибка SQL. Когда я удалил ';'это сработало на отлично. Почему это могло произойти?

0 голосов
/ 05 июня 2018

Не используйте 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-инъекций, когда пользователь может ввести что-то вроде строки value', (SELECT password_hash FROM users WHERE userid = 'Admin1' ) ) --
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...