【问题标题】:Talend: Query Database with Strings/Parameters already definedTalend:使用已定义的字符串/参数查询数据库
【发布时间】:2016-02-16 23:49:31
【问题描述】:

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

例如:“SELECT * from TABLE_X where FIELD_X= ? ;”

我的 '?' 是来自我的 tFlowToIterate 组件 (foo) 的变量。我已经尝试过 (String)globalMap.get("foo") 和其他类似的形式...

谢谢

[Talend Open Studio for Data Integration v5.3.1; DB:甲骨文]

【问题讨论】:

  • 您的职责的第 3 步? ;) 给我 5 分钟的时间来更好地了解您的需求
  • :) 我发现“tMysqlRow”在“高级设置”选项卡中有一个 PreparedStatement 表。这就是我需要的。但我使用的是 Oracle BD。
  • 我想我可以使用 'tOracleRow' 组件,而不是 'tOracleInput'

标签: sql database oracle talend


【解决方案1】:

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

"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. 现在单击“猜测查询”以明确重写您的 SELECT
  4. 如果需要,修复查询(即 WHERE 条件,...)

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-26
      • 1970-01-01
      • 2019-04-10
      • 2013-04-10
      • 1970-01-01
      • 2020-07-20
      • 2016-07-03
      • 1970-01-01
      相关资源
      最近更新 更多