Как вставить несколько строк в DB2 в одном выражении? - PullRequest
0 голосов
/ 17 сентября 2018

Я использую драйверы Java и jdbc для установления соединения с базой данных DB2.Я пытаюсь вставить несколько строк в таблицу с помощью одного оператора.

Ниже приведен мой код:

 public void createResources(List<Resources> addedResources)
        throws SQLException{

    Connection conn = null;
    PreparedStatement statement = null; 
     int i = 0; 

     String values = "INSERT INTO GROUPS (GROUP_NAME, ENTRY_NAME, 
ENTRY_TYPE, LAST_REQ, CREATE_BY, REQ_BY, LAST_CHANGED, LAST_REQ_TIME) VALUES 
 " +  System.getProperty("line.separator");

    while(i < addedResources.size()){

        Timestamp LAST_CHANGED = 
Timestamp.valueOf(addedResources.get(i).getLAST_CHANGED().trim());
        Timestamp LAST_REQ_TIME = 
Timestamp.valueOf(addedResources.get(i).getLAST_REQ_TIME().trim());

        values = values + "('" + 
addedResources.get(i).getGROUP_NAME().trim() + "', '" + 

addedResources.get(i).getENTRY_NAME().trim() + "', '" + 

addedResources.get(i).getENTRY_TYPE().trim() + "', '" +

addedResources.get(i).getLAST_REQ().trim() + "', '"   +

addedResources.get(i).getCREATE_BY().trim() + "', '"  +

addedResources.get(i).getREQ_BY().trim()   + "', '"   +
                                      LAST_CHANGED + "', '"   +
                                      LAST_REQ_TIME + "')," + 
System.getProperty("line.separator"); 


    i = i + 1;
    }   
    values = values.substring(0,values.trim().length()-1);
    Log(Integer.toString(values.length()));
    Log(values);

    try {

         // Get the DB connection
        conn = this.ds.getConnection();
        conn.setAutoCommit(false);

        // Prepare the statement and populate with data
        statement = conn.prepareStatement(values);



        // Perform the INSERT operation
        statement.executeUpdate();

        //Commit the changes 
        conn.commit();
        Log("Employee Successfully Added!");
    }
    finally{


        // Any exceptions will be propagated

        // Close database objects, regardless of what happened
        if ( statement != null ) {
            statement.close();
        }
        if ( conn != null ) {
            conn.close();
        }

    }



   }

Подводя итог, у меня есть цикл, который перебирает объекты в списке иудлиняет оператор вставки до тех пор, пока он не будет содержать все строки в ArrayList.Затем я очищаю конец строки после завершения цикла и пытаюсь выполнить инструкцию.

Вот пример того, как будет выглядеть оператор запроса при выполнении метода:

INSERT INTO GROUPS (GROUP_NAME, ENTRY_NAME, ENTRY_TYPE, LAST_REQ, CREATE_BY, 
REQ_BY, LAST_CHANGED, LAST_REQ_TIME) VALUES 
('JOHN', 'TEST1', 'FILE', 'N/A', 'SSDP071', 'N/A', '2018-09-17 
19:36:34.004', '2018-09-17 19:36:34.004'),
('JOHN', 'TEST2', 'FILE', 'N/A', 'SSDP071', 'N/A', '2018-09-17 
19:36:37.771', '2018-09-17 19:36:37.771'),
('JOHN', 'TEST3', 'FILE', 'N/A', 'SSDP071', 'N/A', '2018-09-17 
19:36:42.021', '2018-09-17 19:36:42.021')

Мой код пытается выполнить и выдает следующую ошибку:

[17.09.18: 36: 42: 834 GMT] 00000557 SystemOut O com.ibm.db2.jcc.am.SqlSyntaxErrorException: [jcc] [50053] [12311] [4.22.37] Исключение T2zOS: [jcc] [T2zos] T2zosPreparedStatement.readPrepareDescribeOutput_: nativePrepareInto: 1583: ошибка SQL механизма DB2, SQLCODE = -104, SQLSTATE = 42601, маркеры ошибок =, FOR NOT ATOMIC ERRORCODE = -104, SQLSTATE = 42601

* 1013запятая, и я не уверен, к чему это относится.Нет ли способа вставить несколько строк в таблицу DB2?Помощь будет оценена!

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Вместо этого вы можете использовать пакетные операторы:

String values = "INSERT INTO GROUPS " +
"(GROUP_NAME,ENTRY_NAME,ENTRY_TYPE,LAST_REQ,CREATE_BY,REQ_BY,LAST_CHANGED,LAST_REQ_TIME) " +
"VALUES (?,?,?,?,?,?,?,?)";

// ... 

statement = conn.prepareStatement(values);

// ... 

while(i < addedResources.size()){
   statement.setString(addedResources.get(i)).getGROUP_NAME().trim());
   statement.setString(addedResources.get(i)).getENTRY_NAME().trim());

   // ...  

   statement.addBatch();
}
statement.executeBatch();
0 голосов
/ 18 сентября 2018

Похоже, вы используете «Драйвер для подключения JDBC и SQLJ типа 2» для z / OS, поэтому я предполагаю, что ваш Db2-сервер работает в z / OS.

Db2 для z / OSподдерживает многострочные вставки для jdbc и static-SQL, а также динамического SQL, и, если необходимо много строк для частой вставки, целесообразно использовать многострочные вставки.Он использует подход, отличный от показанного в вашем вопросе (т.е. не использует предложение VALUES, как вы пытались).

Свойство драйвера enableMultiRowInsertSupport доступно и по умолчанию должно быть включено.Обратите внимание на свойство драйвера atomicMultiRowInsert, если вы хотите, чтобы многострочная вставка была атомарной.

Изучите пример jdbc (в конце) этой страницы .Подробнее о настройках драйвера см. В Центре знаний Db2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...