如何从 Pentaho-Kettle 中基于动态选择的 sql 查询中获取结果集?

Posted

技术标签:

【中文标题】如何从 Pentaho-Kettle 中基于动态选择的 sql 查询中获取结果集?【英文标题】:How to get a resultset from a dynamic select-based sql query in Pentaho-Kettle? 【发布时间】:2019-05-29 14:44:49 【问题描述】:

我想执行一组基于选择的 sql 查询,这些查询源自 XML 文件中的 xml-node 元素,并将相应结果集的值写入 CSV 文件。我想澄清一下,sql查询的任何字段都没有参数化,但是完整的sql查询本身就是。

获取完整的sql查询部分按预期完成,但不知道如何进行启动sql查询的部分,以便稍后获取相应的结果集进行管理。

到目前为止,我尝试过但没有成功的方法如下:

    Execute SQL script step:按照here的说法,这种step不会得到任何结果。

    Dynamic SQL Row 步骤:只要硬编码字段“TemplateSQL”,我就会得到相应的 sql,但我不能这样做,因为从上一步派生的 sql 查询在它们之间非常不同并且不要'不提供固定的元数据方案。

    Table Input 步骤:此步骤只允许参数化 sql 查询的单个值,而不是完整的查询。

如果有 pentaho-kettle 专家能告诉我完成我想做的任务的正确方法,我将不胜感激。

更新(按照@Cristian Curti 的说明): 问题出现在 KTR-1 中。当您说 “您必须将此查询作为变量传递给另一个 KTR” 时,我知道我首先要做的是在变量中设置 xml-node 值,然后将其传递给KTR-2。为此,在我的 KTR-1 中,我使用了以下步骤:

    Get Data from XML: 我得到了 'SQLQuery' 字段。 Set Variables:我在一个名为“QUERY”的变量中设置了“SQLQuery”字段。 (另外,KTR-1是按你说的设置的,也就是在Parameters选项卡中我设置了一个名为'QUERY'的参数)。

当我预览 KTR-1 的第二步时,Kettle 控制台记录以下错误:

Get data from XML.0 - Finished processing (I=2, O=0, R=0, W=2, U=0, E=0)
Set variables.0 - Setting environment variables...
Set variables.0 - Set variable QUERY to value [        
  SELECT "Table1".*, "table2"."field1" FROM "Table1" INNER JOIN "Table2" ON Table1"."PATIENT" = "Table2"."PATIENT" WHERE ("Table1"."field1" > Table1"."field2") AND NOT("field1" BETWEEN 'date1' AND 'date2')     
]
Set variables.0 - ERROR (version 8.2.0.0-342, build 8.2.0.0-342 from 2018-1-14 10.30.55 by buildguy) : Unexpected error
Set variables.0 - ERROR (version 8.2.0.0-342, build 8.2.0.0-342 from 2018-1-14 10.30.55 by buildguy) : org.pentaho.di.core.exception.KettleStepException: 
Set variables.0 - Only 1 input row was expected to set the variables and at least 2 were received.

似乎Set Variables step 只希望收到一行。 我不知道我是做错了什么还是错过了什么。如果您需要更多详细信息,请告诉我。谢谢。

【问题讨论】:

【参考方案1】:

从您分享的链接中,按照 Rishu 的回答,第 2 部分。

在您从 XML 节点获取查询的部分,您必须将此查询作为变量传递给另一个 KTR,并在第二个 KTR 的输入表步骤中,在 SQL 编辑器中使用 $variable步骤。

应该看起来像这样。

更新答案

不,您使用了错误的方法。当您知道只有 1 行将到达该步骤时,您可以使用“设置变量”步骤,当您有多行到达“结果集”时,您需要使用“复制行”>“为每一行执行”方法。这需要执行 1 个 Job 和 2 个 KTR。

您的工作将如下所示:

您的第一个 KTR 的最后一步是“将行复制到结果”。

在 Job 中,您需要这样配置您的第二个 KTR 条目:

Stream 列名必须与包含要执行的查询的第一个 KTR 中的列名匹配,另外,第二个 KTR(第一个答案图片)中的命名参数必须与 JOB 配置中的参数匹配,如图片显示。

之后您所要做的就是为第二个 KTR 上的每个查询生成一个动态文件名,通常所有生成文件的输出步骤都有一个“在文件名中包含日期”和一个“在文件名中包含时间”,两者都应该使用足以零努力地生成不同的文件名,并且您可以获得文件创建时间的时间戳

【讨论】:

感谢您的回复。不幸的是,我没有让事情发挥作用。你能看到我的更新吗?谢谢。 @txapeldot 更新了我的答案。 太棒了!我已经设法让它工作了。您的回复不仅解决了我的问题,还帮助我了解了 Pentaho-Kettle 的工作原理。非常感谢。

以上是关于如何从 Pentaho-Kettle 中基于动态选择的 sql 查询中获取结果集?的主要内容,如果未能解决你的问题,请参考以下文章

如何在应用程序中将所选图片从图片库动态复制到图片文件夹中?

基于第一个下拉菜单的引导多选动态选项

基于 Woocommerce 中的自定义单选按钮的动态运费

动态检查单选按钮,基于“值”属性,不检查

基于单选按钮选择的动态 div 边框

如何在(Jasper Studio)的 mongo DB 查询中制作动态/可选过滤器(参数)