【发布时间】:2018-09-17 19:58:10
【问题描述】:
我正在使用 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();
}
}
}
总而言之,我有一个循环遍历 List 中的对象并延长插入语句,直到它包含 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')
我的代码尝试执行并抛出以下错误:
[9/17/18 19: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: DB2 引擎 SQL 错误,SQLCODE = -104,SQLSTATE = 42601,错误标记 = ,;FOR NOT ATOMIC ERRORCODE=-104,SQLSTATE=42601
我的错误标记是一个逗号,我不确定它指的是哪个。有没有办法在 DB2 表中插入多行?帮助将不胜感激!
【问题讨论】:
-
你认为你的最终陈述会是这样吗,还是你真的把它打印出来了?您是否尝试从日志中复制它并在其中执行它,比如 Db2 CLP?您不使用参数化语句的任何原因?
-
是的,这不是标准 SQL。 Microsoft SQL Server 支持这一点,但我相当肯定 DB2 不支持。您必须发出多个 INSERT 语句。
-
是的。该声明来自系统输出
-
一次一个。感谢您的输入。对这些东西很陌生。只是试图验证我不是简单地输入错误或误解了逻辑
-
我使用的是 DB2 版本 12