Oracle11g Camel 2.13.1 MyBatis 3.2.7批量插入到Oracle 11g表ORA-00933:SQL命令未正确结束

Oracle11g Camel 2.13.1 MyBatis 3.2.7批量插入到Oracle 11g表ORA-00933:SQL命令未正确结束,oracle11g,apache-camel,mybatis,Oracle11g,Apache Camel,Mybatis,我正在尝试使用MyBatis InsertList批处理从驼峰路径向表中插入数据列表。批处理失败,异常为java.sql.BatchUpdateException:ORA-00933:sql命令未正确结束(更多详细信息如下) 我能够插入MyBatis API中没有问题的数据列表(请参阅本文第6节),但它只有在骆驼路线中使用时才会失败 查询很好(请参阅本文中的5.SQL查询客户端),因为我能够成功地从SQL客户端插入数据。我尝试了几种选择,做了很多研究,但还不确定问题出在哪里 如果你能解释一下这个

我正在尝试使用MyBatis InsertList批处理从驼峰路径向表中插入数据列表。批处理失败,异常为java.sql.BatchUpdateException:ORA-00933:sql命令未正确结束(更多详细信息如下)

我能够插入MyBatis API中没有问题的数据列表(请参阅本文第6节),但它只有在骆驼路线中使用时才会失败

查询很好(请参阅本文中的5.SQL查询客户端),因为我能够成功地从SQL客户端插入数据。我尝试了几种选择,做了很多研究,但还不确定问题出在哪里

如果你能解释一下这个问题,我将不胜感激

使用的技术:
Java版本“1.7.0_55”
Apache Camel 2.13.1
MyBatis 3.2.7
Oracle 11g

我把同样的问题贴到网上

以下是与该问题相关的详细信息:

一,。骆驼路线:

<insert id="insertTransactionBidDetail" parameterType="com.isone.cts.rest.binding.cts.TransactionBidsResponse">
        INSERT ALL
        <foreach item="p" collection="transactionBids.transactionBid"
            open="" close="" separator=")">
            into TRANSACTION_BIDS_DATA_T 
            (message_request_id, transaction_source,
            transaction_sink, transaction_user_ref,
            gis_identifier, jess_etag_id)
            values(#{messageRequestID,jdbcType=NUMERIC},
            #{p.transactionSource,jdbcType=VARCHAR},
            #{p.transactionSink,jdbcType=VARCHAR},
            #{p.transactionUserRef,jdbcType=VARCHAR},
            #{p.gisIdentifier,jdbcType=VARCHAR},
            #{p.jessETagID,jdbcType=VARCHAR}
        </foreach>
        )SELECT * FROM dual     
    </insert>
  private static void insertTransactionBidsDetailComplex() {
            SqlSession session = null;
            try {
                TransactionBidsResponse transactionBidsResponse = new TransactionBidsResponse();
                TransactionBids transactionBids = new TransactionBids();
                transactionBids.getTransactionBid().addAll(
                        TransactionBidsDataGenerator.buildTransactionBidList());
                transactionBidsResponse.setTransactionBids(transactionBids);
                transactionBidsResponse.setMessageRequestID(new BigInteger(String
                        .valueOf(System.currentTimeMillis())));
                transactionBidsResponse.setHeader(buildHeader());
                session = getSqlSessionFactory().openSession();
                insert = session.insert(
                        "transactionBidsMapper.insertTransactionBidDetail",
                        transactionBidsResponse);
                session.commit();
            } catch (Exception e) {
                e.printStackTrace();
                session.rollback();
            } finally {
                // close session
                session.close();
            }
        }
从(“计时器:foo?周期=10000”) .setHeader(Exchange.HTTP_方法,常量(HttpMethods.GET)) .setHeader(Exchange.HTTP\u URI,常量(RestURLs.TRANSACTION\u BIDS\u UNQUALIFIED\u URL)) .process(新的CamelGETMessageProcessor()) .to(“restlet:”) .unmarshal(jaxbDataFormat) .process(new TransactionBidsProcessor()).to(“mybatis:insertTransactionBidDetail?语句类型=InsertList&executorType=batch”) .end()


二,。映射器查询:

<insert id="insertTransactionBidDetail" parameterType="com.isone.cts.rest.binding.cts.TransactionBidsResponse">
        INSERT ALL
        <foreach item="p" collection="transactionBids.transactionBid"
            open="" close="" separator=")">
            into TRANSACTION_BIDS_DATA_T 
            (message_request_id, transaction_source,
            transaction_sink, transaction_user_ref,
            gis_identifier, jess_etag_id)
            values(#{messageRequestID,jdbcType=NUMERIC},
            #{p.transactionSource,jdbcType=VARCHAR},
            #{p.transactionSink,jdbcType=VARCHAR},
            #{p.transactionUserRef,jdbcType=VARCHAR},
            #{p.gisIdentifier,jdbcType=VARCHAR},
            #{p.jessETagID,jdbcType=VARCHAR}
        </foreach>
        )SELECT * FROM dual     
    </insert>
  private static void insertTransactionBidsDetailComplex() {
            SqlSession session = null;
            try {
                TransactionBidsResponse transactionBidsResponse = new TransactionBidsResponse();
                TransactionBids transactionBids = new TransactionBids();
                transactionBids.getTransactionBid().addAll(
                        TransactionBidsDataGenerator.buildTransactionBidList());
                transactionBidsResponse.setTransactionBids(transactionBids);
                transactionBidsResponse.setMessageRequestID(new BigInteger(String
                        .valueOf(System.currentTimeMillis())));
                transactionBidsResponse.setHeader(buildHeader());
                session = getSqlSessionFactory().openSession();
                insert = session.insert(
                        "transactionBidsMapper.insertTransactionBidDetail",
                        transactionBidsResponse);
                session.commit();
            } catch (Exception e) {
                e.printStackTrace();
                session.rollback();
            } finally {
                // close session
                session.close();
            }
        }

问题在于MyBatis配置文件中的以下设置:
   The issue lies with the setting below in MyBatis Configuration file:
<setting name="useGeneratedKeys" value="false" /> 
在痛苦地进行端到端调试时,我注意到第103行batchResult.setUpdateCounts(stmt.executeBatch())抛出了一个异常;在BatchExecutor.java(myBatis 3.2.7 jar)中。由于在MyBatis配置中使用useGeneratedKeys的选项设置为true,因此此时发生的情况是:将ROWID返回到?添加到查询的末尾,这会引发异常

我把答案改为false,结果成功了

请注意,除非您确定每个查询都需要返回的ROWID,否则不要将useGeneratedKeys设置为true。您可以在映射器文件中设置useGeneratedKeys选项以进行更多控制,例如,如下所示:

<insert id="insertSomething" useGeneratedKeys="true"
    keyProperty="id">
<!-- Some Query  -->
</insert>