一次合并到多个语句 Oracle SQL

Posted

技术标签:

【中文标题】一次合并到多个语句 Oracle SQL【英文标题】:MERGE INTO multiple statements at once Oracle SQL 【发布时间】:2017-06-01 06:24:55 【问题描述】:

我有一个这样的合并语句:

   private static final String UPSERT_STATEMENT = "MERGE INTO " + TABLE_NAME + " tbl1 " +
    "USING (SELECT ? as KEY,? as DATA,? as LAST_MODIFIED_DATE FROM dual) tbl2 " +
    "ON (tbl1.KEY= tbl2.KEY) " +
    "WHEN MATCHED THEN UPDATE SET DATA = tbl2.DATA, LAST_MODIFIED_DATE = tbl2.LAST_MODIFIED_DATE " +
    "WHEN NOT MATCHED THEN " +
    "INSERT (DETAILS,KEY, DATA, CREATION_DATE, LAST_MODIFIED_DATE) " +
    "VALUES (SEQ.NEXTVAL,tbl2.KEY, tbl2.DATA, tbl2.LAST_MODIFIED_DATE,tbl2.LAST_MODIFIED_DATE)";

这是执行方法:

 public void mergeInto(final JavaRDD<Tuple2<Long, String>> rows) 
    if (rows != null && !rows.isEmpty()) 
        rows.foreachPartition((Iterator<Tuple2<Long, String>> iterator) -> 

            JdbcTemplate jdbcTemplate = jdbcTemplateFactory.getJdbcTemplate();
            LobCreator lobCreator = new DefaultLobHandler().getLobCreator();

            while (iterator.hasNext()) 
                Tuple2<Long, String> row = iterator.next();
                String details = row._2();
                Long key = row._1();

                java.sql.Date lastModifiedDate = Date.valueOf(LocalDate.now());
                Boolean isSuccess = jdbcTemplate.execute(UPSERT_STATEMENT, (PreparedStatementCallback<Boolean>) ps -> 

                    ps.setLong(1, key);
                    lobCreator.setBlobAsBytes(ps, 2, details.getBytes());
                    ps.setObject(3, lastModifiedDate);
                    return ps.execute();
                );
                System.out.println(row + "_" + isSuccess);

            
        );
    

我需要在 PLSQL 中插入多个此语句,如果可能的话,批量插入 10K。

    什么是节省时间的有效方法:一次执行10K条语句,或者如何在同一个事务中执行10K条语句? 我应该如何更改支持它的方法?

谢谢, 我

【问题讨论】:

“hom”表的用途和内容是什么? @HAL9000 已编辑。应该是双重的 【参考方案1】:

    最有效的方法是将您的数据批量加载到数据库中。与逐个上传(如您的示例)相比,我预计性能提升至少 1 或 2 个数量级(“更大”的数据意味着通过批量插入获得的收益更少)。

    您可以使用this answer 中描述的技术先将您的记录批量插入临时表,然后使用临时表执行单个合并语句。

【讨论】:

我看到有一种使用 batchUpdate 进行批量插入的方法,如***.com/questions/9565481/… 中所述,每种方法的优点是什么? 你必须测量/分析它。它们可能相同或非常不同。但至少对于 Oracle 来说,使用 addBatch() 的应该使用一次往返每批(真正的批量加载)而不是每行一次往返。

以上是关于一次合并到多个语句 Oracle SQL的主要内容,如果未能解决你的问题,请参考以下文章

如何在Oracle中一次执行多条sql语句

带条件的 Oracle SQL 合并语句

Oracle SQL 合并语句只有一个表和一堆值

Oracle中怎样一次执行多条sql语句

使用一条语句对多个属性和表进行 Oracle SQL 特权授权

oracle语句中如何把一列的值合并为一个值,用逗号隔开?