Я использую драйверы 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?Помощь будет оценена!