我试图使用骆驼路线中的MyBatis插入列表批处理将数据列表插入到表中。批处理失败,例外java.sql.批处理更新异常: 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
我向骆驼用户发布了同样的问题
以下是与该问题有关的细节:
1.骆驼路线:
从("定时器: foo?期间=10000"). setHeader(Exchange.HTTP_METHOD,常量(Http方法. GET)). setHeader(Exchange.HTTP_URI,常量(RestURLs.TRANSACTION_BIDS_UNQUALIFIED_URL)). flow(new CamelGETMessageProccher()). to("restlet:http://someaddress.com/app/cts/bids").散集(jaxbDataFormats). flow(new TransactionBidsProcencer()). to("mybatis: intertTransactionBidDetail? statementType=InsertList
二,。映射器查询:
<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>
3.SQL日志
[Camel(camel-1)线程#0-计时器://foo]DEBUG transactionBidsMapper.insertTransactionBidDetail-==
[Camel(Camel-1)线#0-timer://foo]调试transactionBidsMapper。insertTransactionBidDetail-==
四,。下面是抛出的异常
[camel(camel-1)线程#0-计时器://foo]DEBUGorg.apache.camel.processor.DefaultErrorHandler-无法传递(MessageId: ID-sporeddy-51161-1406290670797-0-1在ExChangeId: ID-sporeddy-51161-1406290670797-0-2)。传递尝试: 0捕获:org.apache.ibatis.exceptions.持久性异常:
[Camel(Camel-1)线#0-timer://foo]信息组织。阿帕奇。骆驼加工机拦截器。示踪剂-ID-DDY-51161-1406290670797-0-2
[Camel(Camel-1)线#0-timer://foo]调试com。伊森。cts。骆驼加工机CamelPersistenceProcessor-PersistenceException getResponseBody
五,。客户端SQL查询
在事务投标数据中插入所有值(1406037318681,‘nodeSone14’、‘NODENYISO0’、‘USERREFGPKL44220’、‘HASHMASHSMASH’、‘SCA_PSE’、‘1110RCA’)到事务投标数据中(message_request_id、transaction_source、transaction_sink、transaction_user_ref、gis_identifier、jess_etag_id)值(1406037318681、'NodeSone14'、'NODENYISO0'、'USERREFGPKL44220'、'HASHMASHSMASH'、'SCA_PSE_1110RCA'))转换为transaction_BIDS_DATA_T(message_request_id、transaction_source、transaction_ref、transaction_sink_sink、transaction_user_ref、transaction_ref、transaction_ref(1406037318681,‘nodeSone14’、‘NODENYISO0’、‘USERREFGPKL44220’、‘HASHMASHSMASH’、‘SCA_PSE _1110RCA’)转换为事务投标数据(消息请求id、事务源、事务接收器、事务用户ref、gis_标识符、jess_etag_id)值(1406037318681、‘NODEISONE14’、‘NODENYISO0’、‘USERREFGPKL44220’、‘hashmashsmashsmashsmash’、‘SCA_PSE 1110RCA’)
六,。当从MyBatis API运行相同的查询时,效果良好
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();
}
}
The issue lies with the setting below in MyBatis Configuration file:
<setting name="useGeneratedKeys" value="false" />
在端到端的痛苦调试中,我注意到在BatchExecutor.java(myBatis 3.2.7 jar)中,在第103行batchResult.setUpdateCounts(stmt.executeBatch())处抛出了一个异常。由于在MyBatis配置中使用useGeneratedKeys的选项设置为true,此时发生的情况是:返回ROWID INTO?被添加到查询的末尾,这是抛出一个异常。
我把它改成了false,它起作用了。
请注意,除非确定每个查询都需要返回的ROWID,否则不要将useGeneratedKeys设置为true。您可以在mapper文件中设置useGeneratedKeys选项以获得更多控制,例如:
<insert id="insertSomething" useGeneratedKeys="true"
keyProperty="id">
<!-- Some Query -->
</insert>
我试图从MySQL移动到Oracle和我的一个查询最初看起来像这样 然而,当我在ORACLE中运行同一个查询时,只做了一个小改动。。。 它给了我以下错误: SQL错误:ORA-00933:SQL命令未正确结束00933。00000-“SQL命令未正确结束” Oracle SQL Developer工具强调了声明部分的一个问题 作为t1 我读了一些其他的问题,提到在Oracle语句的某些部分周围放置
我遇到了一个甲骨文错误, ORA-00933:SQL命令未正确结束 有以下几点。 我在每个语句末尾的“/”前面加了分号。 有什么建议我可能错了吗?
目的是仅当同一个表中不存在相同的记录时,才将记录插入表中。所以,我将该表的值存储在如下游标中:- 现在,我将使用如下的内部联接从表中删除记录- 执行此删除语句时,我收到错误-'ORA-00933:SQL命令未正确结束' 如果我能够从表中删除记录,我将使用以下代码从游标数据中插入相同的记录到相同的表中:- 我的目标是,仅当同一个表中不存在相同的记录时,才将记录插入表中。 请指导如何处理delete语
我正在尝试创建一个where子句作为参数传递给Oracle命令,事实证明这比我想象的要困难得多。我想做的是根据应用程序中的用户输入创建一个大型where查询。其中query是语句的单个参数,并且将包含多个and、OR条件。但这里的代码并不完全符合我的要求: 如果我将下面的行更改为我想要的结果类型,那么我会得到一个错误"ORA-00933:SQL命令未正确结束": 我的问题是,如何在不导致此错误的情
线程“main”java.SQL.sqlsyntaxerrorexception:ORA-00933:SQL命令未正确结束 我怀疑我们不能为Oracle查询提供“as employees_data”,那么我做错了什么?
我试图在Laravel 4.2中使用Oracle作为后端执行更新命令,如下所示。每当我尝试这样做时,我都会出错 我该如何解决这个问题,我错在哪里?谢谢你的建议。