【问题标题】:Select/Insert from identical table on two different DB connections从两个不同数据库连接上的相同表中选择/插入
【发布时间】:2017-09-20 15:39:27
【问题描述】:

我必须从一个表中进行选择,然后在两个不同的数据库连接上插入另一个相同(相同结构)的表。 这是我的代码:

    from("direct:" + getId)
.toD("sql:classpath:" +getSql1 + "?datasource= DataSourse1&usePlaceHolder=true"))
.setHeaders("Results", simple(${body})
toD("sql:classpath:" +getSql2 + "?datasource= DataSourse2&usePlaceHolder=true"))

在哪里 getSQL1 : 从 Product1 中选择 * 和 getSQL2 :插入 Product2 值(${headers.results})

我想,由于我试图插入的数据格式,它不起作用。我从 Select 中得到的是这样的: [{ID=130, 描述=Product130}] 所以,我需要清理我的数据,只得到 130,'Product130' 有什么帮助吗?谢谢。

【问题讨论】:

  • .setHeaders()?你有例外吗?无论如何,返回的数据格式是(默认情况下)Java 对象:List of Map。它是一个列表,因为那里没有任何东西可以阻止返回多条记录,以及多列的映射。如果您希望只有一条记录,您可以使用 sql uri 选项outputType=SelectOne,如果您有多个列,它将只给您一个 Map。我不确定你是如何将你的 sql 字符串外部化的......你也不需要 .toD() 来实现你想要的。

标签: select apache-camel sql-insert


【解决方案1】:

假设您的实际代码有效并且您只是传输一条记录,请将 getSql1 选择选项部分更改为:

"?datasource= DataSourse1&usePlaceHolder=true&outputType=SelectOne"

这会将地图放入您的消息正文中,而不是地图列表。无需将结果复制到标题中。使用 Camel 的 SQL 组件,如果正文类型是 Java Map,它将在您的消息正文中查找命名查询参数。

接下来更改插入以使用地图中的参数:

insert into Product2 (ID, DESCRIPTION) values (:#ID, :#DESCRIPTION)

请注意,我包含了列名。这是为了安全和良好的做法。如果偶然列顺序与原始表不同,这仍然有效。

【讨论】:

  • 我正在传输多条记录。只是为了简化,我编写了 select 以返回一条记录。当然,我得到的是地图列表。我想知道是否可以做这样的事情: Insert into Product2 Select * from Product1 ?
  • 由于有可能返回多条记录,我建议在执行您的选择后使用 Camel 的 Splitter EIP 通过像这样在主体上进行拆分:..split().body().<the insert into I showed above>.end().<whatever else you want to do>...。我认为这解决了你原来的问题。至于你的新 SQL 问题,这里之前已经问过了。因为它使用不同的数据库,所以解决方案通常是特定于数据库供应商的。但是,如果 SQL 适用于您的特定数据库品牌,您可以(通常)使用 Camel 来执行它。
  • 我听从了您的建议,现在工作正常。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 2017-04-10
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多