【发布时间】:2016-08-19 09:14:28
【问题描述】:
我是 Camel 的新手,我尝试处理 SQL 数据。如果 SQL 消费(选择)完成,我会尝试更新消费的行,但我只是得到一个“错误的 SQL 语法”异常。
我使用 Apache Camel SQL 组件,其中起始端点是 sql select 语句。要将它们标记为已使用,我使用SQL-Component 的onConsume 参数。在select中,v_table是原表t_table的视图,后面更新时用到。所以v_table和t_table中一行的id是一样的。为了不更新t_table 中的所有行,我使用where id = :#id 的where 条件。
String sqlSelect = "select * from v_table where camel_is_read = 0";
String sqlUpdate = "update t_table set camel_is_read = 1, date_checked = sysdate where id = :#id";
from("sql:"+sqlSelect+"?dataSource=myDataSource&onConsume="+sqlUpdate)
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
System.out.println(exchange.getIn().getBody().toString());
}
})
.errorHandler(deadLetterChannel("direct:moveFailedOut").useOriginalMessage())
.bean("orderToJms")
.to(jmsURI)
.bean("validate")
.to(ftpOut);
如果我执行这个,我会得到以下异常:
WARN Error executing onConsume/onConsumeFailed query update t_table set camel_is_read = 1, date_checked = sysdate where id = :?id. Caused by: [org.springframework.jdbc.BadSqlGrammarException - PreparedStatementCallback; bad SQL grammar [update t_table set camel_is_read = 1, date_checked = sysdate where id = ?]; nested exception is java.sql.SQLSyntaxErrorException: ORA-00904: "YSDATEHERE": ungültiger Bezeichner
]
org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [update t_table set camel_is_read = 1, date_checked = sysdate where id = ? exception is java.sql.SQLSyntaxErrorException: ORA-00904: "YSDATEHERE": ungültiger Bezeichner
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:237)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:605)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:617)
at org.apache.camel.component.sql.DefaultSqlProcessingStrategy.commit(DefaultSqlProcessingStrategy.java:46)
at org.apache.camel.component.sql.SqlConsumer.processBatch(SqlConsumer.java:195)
at org.apache.camel.component.sql.SqlConsumer$1.doInPreparedStatement(SqlConsumer.java:118)
at org.apache.camel.component.sql.SqlConsumer$1.doInPreparedStatement(SqlConsumer.java:91)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:589)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:617)
at org.apache.camel.component.sql.SqlConsumer.poll(SqlConsumer.java:91)
at org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:174)
at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:101)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:351)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:178)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: java.sql.SQLSyntaxErrorException: ORA-00904: "YSDATEHERE": ungültiger Bezeichner
我尝试使用 test-id(例如“3”)在数据库中手动执行更新,这有效,因此通用 SQL 语法应该没问题。所以在我看来,Camel 无法替换 :#id 参数。
我添加了一个处理器来检查选择的结果:
{ID=3, [...] CAMEL_IS_READ=0}
在这里我可以看到,选择成功地捕获了必要的id。我不明白为什么 Camel 不能用 id 值 3 替换 :#id 参数。有谁知道如何解决这个问题?我使用this 和this 作为粗略的示例/模板。还是这种方法总体上是错误的?
【问题讨论】:
-
sysdate 应该是大写吗?
-
嗨@ClausIbsen,谢谢你的回复(我喜欢你的书:)。我实际上尝试使用 SYSDATE 而不是 sysdate,但它没有显示效果。我还直接在我的 oracle 数据库中尝试了整个更新语句,它可以工作。它也可以在没有 id 参数的情况下工作(但这不是目标,我只想更新已处理的行)。
-
什么版本的骆驼。您可以尝试升级。
-
错误消息说它无法识别“YSDATEHERE”。这看起来很像“SYSDATE WHERE”,每个单词的第一个字符都被删除了!
-
抱歉我的回复晚了。 @ClausIbsen 我在 2.14.1 版本中使用了 camel-sql,并将 camel-core 和 camel-sql 更新到 2.17.3。我仍然得到同样的错误。我发现,如果我使用正确的“:#id”参数并不重要,使用“#id”或“#”我得到相同的db-error。但是,如果我使用正确的 id,例如:“... sysdate where id = 9”,它可以正常工作。在 Darius X 的提示下,我将语句更改为 ".. date_checked = '29.08.2016' where id = :#id" 并且它有效!所以看起来,参数的额外骆驼代码与Oracles SYSDATE有问题吗?如何同时使用参数和 sysdate?
标签: parameters apache-camel camel-sql