【问题标题】:Dynamic sql for batch processing用于批处理的动态sql
【发布时间】:2015-06-29 17:50:06
【问题描述】:

我是 MyBatis 的新手。我正在尝试对一个 ORACLE db 表进行批量插入。这是 XML 映射器文件中的代码,

<insert id="insertAuditLogAsBatch" >
    insert into AUDIT_LOG (ID,ENTITY_ID,PERIOD_ID )
    select SEQ_AUDIT_LOG.nextval, entityId, periodId
    from
    <foreach collection="auditLogs" item="auditLog">
        ( SELECT 1 as entityId, 1 as periodId FROM DUAL UNION ALL )
    </foreach>
    SELECT * FROM dual
</insert>

这是一个示例代码,我正在尝试保留硬编码值。

上述程序从 Oracle 抛出以下错误,

;糟糕的 SQL 语法 [];嵌套异常是 java.sql.BatchUpdateException: ORA-00928: missing SELECT keyword

从我的代码生成的批处理 SQL 在右括号')'之前的末尾有一个“UNION ALL”。我需要的如下,对于最后一个 select 语句我最后不需要'UNION ALL'。我的问题是,

  1. 我能否检查 foreach 中的某些条件,以便最后一个 select 不会有“UNION ALL”。相反,我们应该使用 ')' 括号来指示 SELECT 语句的结束。
  2. 此行插入是批处理的吗?我在这里尝试使用 MyBatis 测试批处理操作。

【问题讨论】:

    标签: oracle mybatis sql-insert


    【解决方案1】:

    根据您输入的完整版本:

    <insert id="insertAuditLogAsBatch" >
        insert into AUDIT_LOG (ID,ENTITY_ID,PERIOD_ID )
        select SEQ_AUDIT_LOG.nextval, entityId, periodId
        from
        (
        <foreach collection="auditLogs" item="auditLog"  open="(" separator=" UNION ALL " close=")"> 
        SELECT 1 as entityId, 1 as periodId FROM DUAL
        </foreach>
        ) 
    </insert>
    

    尝试类似:

    <foreach collection="auditLogs" item="auditLog"  open="(" separator=" UNION ALL " close=")"> >
        SELECT 1 as entityId, 1 as periodId FROM DUAL
    </foreach>
    

    【讨论】:

    • 我试过用这个, 但现在我得到一个不同的错误: 糟糕的 SQL 语法 [];嵌套异常是 java.sql.BatchUpdateException: ORA-00933: SQL 命令未正确结束。我们还可以确保这是批量插入数据库吗?
    【解决方案2】:

    这个行插入是批处理的吗?我试图测试批次 此处使用 MyBatis 进行操作。

    没有。这不是 Mybatis 中批处理操作的方式。对于批量插入,您必须

    1) 提及您希望会话进行批处理操作

    SqlSession  session = sqlSessionFactory.openSession(ExecutorType.BATCH);
    

    2) 为要插入的每条记录重复调用简单的插入(不带任何 foreach)

    for (Foo foo: fooList) 
            fooDao.persistFoo(foo);
    

    3) 每 N 条记录刷新一次会话

     session.flushStatements();
    

    4) 插入所有记录后提交。

     session.commit();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      • 2015-12-19
      • 2016-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多