使用准备好的语句时出现 Camel -Spring SQLException
Posted
技术标签:
【中文标题】使用准备好的语句时出现 Camel -Spring SQLException【英文标题】:Camel -Spring SQLException while using prepared statements 【发布时间】:2015-10-08 19:10:34 【问题描述】:在 Spring 2.7.11 中使用 Camel 2.13.1 并在尝试使用 sql 组件运行更新查询时收到 SQL 异常。下面是如何将我的更新查询添加到路由中,并且我正在使用正文中的 java.util.Map 将输入参数值传递给该语句。
主要问题:如果我在准备好的语句中只有一个输入参数,那么它工作正常。如果我在下面的更新查询中有多个,那么它会失败并出现 sql 异常
<route id="ABC" >
<from uri="direct:sqlInsert" />
<process ref="sqlProcessor" />
<to uri="sql:UPDATE myTable set key1=:#value1, key2=:#value2, key3=:#value3 where req1=:#reqValue1" />
</route>
即使我使用 camel-JDBC 也面临同样的问题
<route id="ABC" >
<from uri="direct:sqlInsert" />
<process ref="sqlProcessor" />
<setBody>
<constant>UPDATE myTable set key1=:?value1, key2=:?value2, key3=:?value3 where req1=:?reqValue1</constant>
</setBody>
<to uri="jdbc:customDatasource?useHeadersAsParameters=true" />
</route>
这是我一直看到的 SQL 异常..
JMS 消息侦听器执行失败。引起:[org.apache.camel.RuntimeCamelException - org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback;糟糕的 SQL 语法 [];嵌套异常是 java.sql.SQLSyntaxErrorException: ORA-00942: 表或视图不存在 ]:org.apache.camel.RuntimeCamelException:org.springframework.jdbc.BadSqlGrammarException:PreparedStatementCallback;糟糕的 SQL 语法 [];嵌套异常是 java.sql.SQLSyntaxErrorException: ORA-00942: 表或视图不存在
注意:数据库连接和数据库表没有问题
【问题讨论】:
Oracle的错误告诉你表myTable不存在 @ClausIbsen 不幸的是,这里不是这种情况。如果我只将一个参数传递给准备好的语句,对另一个进行硬编码,它执行得很好。只有当我有多个输入参数时,我才会看到这个问题。 【参考方案1】:在this question 中有人遇到了同样的错误。他通过改变参数类型来解决它。如果你的论点是好的类型,请尝试确认。尝试硬编码没有一个参数的所有参数,就像你尝试的那样,但更改不是硬编码的参数。这样您就可以确定哪个参数导致错误。
【讨论】:
我报告的问题与您提供的链接中的问题不同。我有数据库连接和有效的表结构,而且一切都正确。如果我有一个 SQL 执行得非常好将参数输入到准备好的语句中,如果有多个,则不接受。这个问题与骆驼有关,与数据库无关。【参考方案2】:我们在使用参数时遇到了同样的问题。我们的应用服务器是 weblogic 12c。奇怪,但降级到 11g 解决了这个问题。
希望这些信息对你有所帮助!
【讨论】:
【参考方案3】:我也遇到了同样的问题,不过,我找到了解决方案。
sql:UPDATE myTable set key1=:#value1, key2=:#value2, key3=:#value3 where req1=CAST(:#reqValue1 as NCHAR(25))
仅在 where 子句中,确保您给出查询中所见的字符长度。
如果它也能解决您的问题,请告诉我们。
其他: 它的工作我有同样的问题,这解决了错误
【讨论】:
以上是关于使用准备好的语句时出现 Camel -Spring SQLException的主要内容,如果未能解决你的问题,请参考以下文章
Android:当我使用 AsyncTask 时出现“调用线程必须是准备好的 Looper 线程”错误