Parameters 如何使用Apache Camel sql组件仅更新已使用的sql行?

Parameters 如何使用Apache Camel sql组件仅更新已使用的sql行?,parameters,apache-camel,camel-sql,Parameters,Apache Camel,Camel Sql,我是骆驼队的新手,我尝试处理SQL数据。如果SQL消费选择完成,我将尝试更新消费的行,但我只得到一个错误的SQL语法异常 我使用ApacheCamel SQL组件,其中起始端点是SQL select语句。要将它们标记为已使用,我使用的onConsume参数。在select中,v_table是原始表t_table的视图,之后在更新中使用。所以v_表和t_表中的行的id是相同的。为了不更新t_表中的所有行,我使用where条件,其中id=:id 如果执行此操作,则会出现以下异常: WARN Err

我是骆驼队的新手,我尝试处理SQL数据。如果SQL消费选择完成,我将尝试更新消费的行,但我只得到一个错误的SQL语法异常

我使用ApacheCamel SQL组件,其中起始端点是SQL select语句。要将它们标记为已使用,我使用的onConsume参数。在select中,v_table是原始表t_table的视图,之后在更新中使用。所以v_表和t_表中的行的id是相同的。为了不更新t_表中的所有行,我使用where条件,其中id=:id

如果执行此操作,则会出现以下异常:

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
我尝试在数据库中使用测试id e手动执行更新。G3,这是有效的,因此GeneralSQL语法应该是良好的。因此,对我来说,Camel无法替换:id参数

我添加了一个处理器,以检查select的结果:

{ID=3, [...] CAMEL_IS_READ=0}

在这里,我可以看到select成功捕获了必要的id。我不明白为什么Camel不能用id值3替换:id参数。有人知道如何解决这个问题吗?我使用和作为粗略的示例/模板。或者这种方法总体上是错误的?

最后,它通过使用to_date函数包围sysdate语句对我有效:

String sqlSelect = "select * from v_table where camel_is_read = 0";
String sqlUpdate = "update t_table set camel_is_read = 1, date_checked = to_date(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);
一些注意事项,在我看来,什么不起作用/不是一个好主意,可能会节省您的时间: 在某些情况下,onConsumeBatchComplete可能是一种解决方案。如果您知道条件,您可能会暗示,如果所有具有此条件的行都通过camel传递,则可以更新这些行。这与sysdate一起工作,不需要id占位符。此解决方案的缺点是,它是隐含的,如果同时添加了新的行(camel未通过),则在批处理完成后也会更新这些行。所以我不能推荐这个。 在Java中设置时间也不起作用,如下所示:

String sqlUpdate = "update t_table date_checked = " + today + " where id = :#id";

如果不每天重新启动路线,驼峰路线将在几天、几周或几年内处于活动状态。在这种情况下,驼峰路线将在启动时生成,在此之后,将始终使用此日期修复今天的日期。因此,它将始终使用相同的日期进行数据库更新。

sysdate是否应为大写?您好@ClausIbsen,谢谢您的回复,我喜欢您的书:。实际上,我用SYSDATE而不是SYSDATE进行了尝试,但没有显示效果。我还直接在我的oracle数据库中尝试了整个update语句。它也可以在没有id参数的情况下工作,但这不是目标,我只想更新处理过的行。什么版本的Camel。您可以尝试升级。错误消息显示无法在此处识别YSDATE。这看起来很像SYSDATE,每个单词的第一个字符都被删除了!很抱歉我反应太晚了@克劳西布森一世在2.14.1版中使用了camel-sql,并将camel-core和camel-sql更新为2.17.3。我仍然会犯同样的错误。我发现,我是否使用正确的:id参数和id,或者我得到相同的db错误,都无关紧要。但是如果我使用正确的id,比如:。。。sysdate,其中id=9,它工作正常。在Darius X的暗示下,我把陈述改为。。检查日期='29.08.2016',其中id=:id,它可以工作!看来,参数的附加camel代码与Oracles SYSDATE有问题?如何将参数和sysdate一起使用?
String sqlUpdate = "update t_table date_checked = " + today + " where id = :#id";