我想执行多个sql insert语句,这些语句存储在java中的字符串中。 下面是一个字符串:
insert_string = "INSERT INTO temp values(TO_DATE ('12-08-15', 'DD/MM/RRRR') - 1, 'rahul', 'START', '12-08-15 06:32:33.577676 PM');
INSERT INTO temp values(TO_DATE ('12-08-15', 'DD/MM/RRRR') - 1, 'abhishek', 'START', '12-08-15 06:32:33.577676 PM');"
我试图通过batchExecute()
执行它,但它对我不起作用。请建议我该怎么办?
答案 0 :(得分:3)
以下是来自https://docs.oracle.com/javase/tutorial/jdbc/basics/retrieving.html的经过编辑的示例, 来自使用批处理更新的语句对象
部分您似乎需要在批次电话之间拆分insert_string
,如下所示:
Connection con = createConnection(); // Get the connection somehow
Statement stmt = null;
try {
con.setAutoCommit(false);
stmt = con.createStatement();
stmt.addBatch("INSERT INTO temp values(" +
" TO_DATE('12-08-15','DD/MM/RRRR') - 1, " +
" 'rahul', 'START', '12-08-15 06:32:33.577676 PM') " );
stmt.addBatch("INSERT INTO temp values(" +
" TO_DATE ('12-08-15','DD/MM/RRRR') - 1, " +
" 'abhishek','START','12-08-15 06:32:33.577676 PM') ");
// ...the rest of the statements
int [] updateCounts = stmt.executeBatch();
con.commit(); // don't forget to call commit
} catch(BatchUpdateException b) {
// Handle this Batch Update Exception
} catch(SQLException ex) {
// Handle regular SQL Exception;
} finally {
// Make sure to call this.
if (stmt != null) { stmt.close(); }
con.setAutoCommit(true);
}
答案 1 :(得分:2)
this one和this one等各种SO答案意味着您无法使用当前的方法。
Marin的回答(我已经投票)显示了如何批量处理单个INSERT
语句。
您也可以使用INSERT ALL
语句在单个查询中执行此操作。与Marin的回答一样,您需要更改SQL:
INSERT ALL
INTO temp values(TO_DATE ('12-08-15', 'DD/MM/RRRR') - 1, 'rahul', 'START', '12-08-15 06:32:33.577676 PM')
INTO temp values(TO_DATE ('12-08-15', 'DD/MM/RRRR') - 1, 'abhishek', 'START', '12-08-15 06:32:33.577676 PM')
SELECT * FROM DUAL;";
另外,我会避免使用RRRR
格式字符串,除非您碰巧使用的是非Y2K兼容的应用程序,否则您的终身梦想就是创建它。更进一步,这里甚至不需要TO_DATE
,因为Oracle支持ANSI日期文字语法:
INSERT ALL
INTO temp values(DATE '2015-12-08' - 1, 'rahul', 'START', '12-08-15 06:32:33.577676 PM')
INTO temp values(DATE '2015-12-08' - 1, 'abhishek', 'START', '12-08-15 06:32:33.577676 PM')
SELECT * FROM DUAL;
<强>附录强>
如果插入的最后一列是时间戳类型,我建议使用ANSI时间戳文字。如果您依赖于使用默认显示格式的隐式转换,那么这是一种危险的做法,因为有人可以通过简单地更改默认时间戳显示格式来破坏您的代码。
使用ANSI时间戳值更新的答案如下(对于您需要使用24小时制的ANSI值):
INSERT ALL
INTO temp values(DATE '2015-12-08' - 1, 'rahul', 'START', TIMESTAMP '2015-12-08 18:32:33.577676')
INTO temp values(DATE '2015-12-08' - 1, 'abhishek', 'START', TIMESTAMP '2015-12-08 18:32:33.577676')
SELECT * FROM DUAL;
了解当您指定这样的日期和时间戳值时,无论当前会话或数据库日期/时间戳格式设置如何,您的Oracle代码每次都 。
当然,既然你是通过Java来做的,那么更好的方法就是使用预处理语句。它们也不受日期/时间戳格式设置的影响,而且防御SQL注入还有更重要的好处。