Pentaho 将变量从修改后的 java 脚本值传递到表输入
Posted
技术标签:
【中文标题】Pentaho 将变量从修改后的 java 脚本值传递到表输入【英文标题】:Pentaho passing variable from modified java script value to table input 【发布时间】:2017-04-27 02:05:11 【问题描述】:我需要从修改后的 java 脚本值中传递变量并将其传递给表输入查询
这是我的
如果我点击预览输出
initator_reference | a | '' |
1 | a | null |
2 | a | null |
3 | a | null |
4 | a | null |
它不应该为空,而是第三个字段上的“测试”字符串 不要问我为什么我把那个变量放在select中,它只是为了在我把它放在“where condition=variable”之前进行测试
【问题讨论】:
【参考方案1】:表格输入支持使 SQL 动态化的两种不同方式:变量替换和从传入流中插入数据。
变量替换
这是您当前在表格输入中配置的内容:您将 $variable 放在某处,当步骤初始化时,该值将作为文本粘贴到 SQL 中。
由于所有步骤在转换中同时初始化,因此您的 javascript 步骤没有时间设置值。在 PDI 中,您不能在同一转换中设置和使用变量。
插入步骤中的数据
第二种方法是通过在表格输入的“从步骤中插入数据”选项中选择一个源步骤来使用。在这种模式下,表格输入从选定的步骤中取出一行,并将字段(按顺序)插入到您插入的问号 (?) 处的 SQL 中。通常它需要一行,但您可以选择为每一行执行。
这种方式应该适用于您的场景:
-
在开始处放置一个 Generate Rows 步骤并将其设置为生成 1 行。
将其连接到 Javascript 步骤。
在 Javascript 步骤中,将返回变量指定为底部网格中的输出字段,它将被添加到流中。
在表格输入中,选择“从步骤插入数据”处的 Javascript 步骤
在您的 SQL 中,插入 ?在变量的位置。如果值是字符串,您可能需要用单引号括起来:WHERE column = '?'。
预览转换以查看结果,表格输入的预览由于依赖关系而被禁用。
注意事项:
步骤 1 和 2 可能不需要,我不确定 JS 步骤是否自己生成一行。我喜欢明确说明这一点,通常将 Generate Rows 步骤命名为“Generate 1 row”。 如果您有一个现有的流或多个要插入的字段,您可以使用“选择值”步骤将字段按需要插入 SQL 的顺序放置。【讨论】:
已经完成了你的步骤,但表格输入错误,请参阅我的答案部分的图片(第二张图片) @AlexanderChandra:在你的第二张照片中,我看不到 ?在您的表格输入中。您可能会收到错误“未知列...”。试试单引号。 我们如何用逗号分隔的字符串替换变量来运行查询,例如 where a column in (?)。我尝试将此字符串发送到表输入,但替换不计算?括号内。我尝试通过字符串连接 () 然后直接发送到?在表输入中,但这不起作用,因为 PDI 添加了“”它就像“(myCommaSeparatedStrings)”,这我的查询失败了。 @Navroop 这几乎是一个新问题,而不是评论。这 ?如您所见,由于转义,插入仅适用于简单字符串。如果您在 where 子句中需要可变数量的值,您可能会更幸运地构建自定义 SQL 语句并使用 SQL 步骤。【参考方案2】:我自己找到了解决方案 第一步是修改java script value->set variables 然后获取变量->表格输入(检查脚本中的替换变量),您只需要放置“?”到您的查询(这个“?”字符串是您的变量,我不知道是否有任何其他方式来调用变量)
提醒一下,pentaho 上的 javascript 与真正的 javascript 有点不同
【讨论】:
也许他们在以后的版本中改变了一些东西,但根据我的经验,这应该行不通。据我所知,如果没有输入,则根本不应该处理 JS 步骤。并且 Get Variable 步骤应该与 JS 和 Set Variables 步骤并行处理。您确定该值是 JS 步骤中设置的值吗?它不仅仅是在获取变量步骤或 ktr 属性中设置的默认值?并且在 Spoon 重新启动后第一次运行 ktr 时,JS 的值被拾取? 好吧,我刚刚发现了问题,我第一次运行预览它显示今天日期 - 10(我的 javascript)然后我将我的 javascript 更改为今天 8 并且它仍然显示今天 10。你有解决办法吗? @Cyrus 建议的方法应该可行。基本上,您需要将单行输入放入 JS 步骤(您可以使用 Detect empty stream 步骤:它不会生成列,因此您不需要删除它们),然后放置您的 Table 输入而不是您的 Set 变量step 并将“Input data from step”替换为指向 JS 步骤。最后删除设置/获取变量步骤。它应该可以工作。以上是关于Pentaho 将变量从修改后的 java 脚本值传递到表输入的主要内容,如果未能解决你的问题,请参考以下文章