当前位置: 首页 > 知识库问答 >
问题:

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

段干子晋
2023-03-14

我试图使用骆驼路线中的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();
            }
        }


共有1个答案

史涵育
2023-03-14
   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作为后端执行更新命令,如下所示。每当我尝试这样做时,我都会出错 我该如何解决这个问题,我错在哪里?谢谢你的建议。