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