Talend:已定义字符串/参数的查询数据库

时间:2013-12-04 09:40:43

标签: sql database oracle talend

如何对数据库执行查询(使用 tOracleInput ),如选择,并使用已在其他组件中定义为参数的字符串,例如在“tFlowToIterate”中?

例如:“来自TABLE_X的SELECT *,其中FIELD_X =?;”

我的'?'是来自我的tFlowToIterate组件(foo)的变量。我已经尝试过(String)globalMap.get(“foo”),以及其他类似的表单......

由于

[Talend Open Studio for Data Integration v5.3.1;  DB:Oracle]

2 个答案:

答案 0 :(得分:7)

你自己回答。 tOracleInput组件接受查询作为参数。这是一个非常无聊的java字符串,不多也不少。这意味着如果要在查询中使用globalMap元素,则只需要执行java String连接。这样的事情:

"SELECT * from TABLE_X where FIELD_X='" + (String)globalMap.get("foo") + "'"

不会工作(仔细查看引号):

"SELECT * from TABLE_X where FIELD_X='(String)globalMap.get("foo")'"

请记住,如果使用字符串连接和外部变量编写查询,查询编辑器可能会弄乱所有引号,从而生成查询损坏。

作为一般建议,我从不建议在tOracleInput之类的数据库输入组件中使用“*”运算符。 Talend具有在编译时生成的固定方案结构。这意味着,如果有一天您将向TABLE_X添​​加一列,您的ETL将会失败。

更强大的解决方案如下:

  1. 使用*运算符
  2. 记下您的查询
  3. 单击“猜测架构”以检索表架构并放入组件元数据
  4. 现在点击“猜测查询”以明确重写您的SELECT
  5. 根据需要修复查询(即WHERE条件......)

答案 1 :(得分:3)

你只需要将它与你的变量连接起来。

所以在你的情况下,它看起来像:

"SELECT *
FROM TABLE_X
WHERE FIELD_X = '" + (String)globalMap.get("foo") + "'"