如何在oracle中插入multipleinsert语句

时间:2015-08-12 13:11:37

标签: sql oracle plsql

我想执行多个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()执行它,但它对我不起作用。请建议我该怎么办?

2 个答案:

答案 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 onethis 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注入还有更重要的好处。