如何从 Pentaho-Kettle 中基于动态 select 的 sql 查询获取结果集?
How to get a resultset from a dynamic select-based sql query in Pentaho-Kettle?
我想执行一组基于 select 的 sql 查询,这些查询源自 XML 文件中的 xml-node 元素,并写入值CSV 文件中的相应结果集。我想澄清一下 sql 查询的任何字段都没有被参数化,但是完整的 sql 查询本身是参数化的。
获取完整 sql 查询的部分已按预期完成,但我不知道如何继续启动 sql 查询的部分,以便我可以获得相应的稍后管理它的结果集。
到目前为止,我尝试过的方法如下:
Execute SQL script
步骤:按照here的说法,这种步骤不会得到任何结果集。
Dynamic SQL Row
步骤:只要我硬编码字段'TemplateSQL',我就得到了相应的sql,但我不能那样做,因为sql 从上一步派生的查询在它们之间非常不同,并且不提供固定的元数据方案。
Table Input
步骤:此步骤仅允许参数化 sql 查询的单个值,而不是完整查询。
如果有 pentaho-kettle 专家能告诉我完成我想做的任务的正确方法,我将不胜感激。
更新(遵循@Cristian Curti 说明):
问题出现在 KTR-1 中。当你说 "you have to pass this query as a variable to another 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
步骤只希望收到一行。
我不知道我是做错了什么还是遗漏了什么。如果您需要更多详细信息,请告诉我。谢谢。
根据您分享的 link,按照 Rishu 的回答,第 2 部分进行操作。
在您从 XML 节点获取查询的部分,您必须将此查询作为变量传递给另一个 KTR,并且在第二个 KTR 的输入 Table 步骤中, 在步骤的 SQL 编辑器中使用 ${variable}。
应该看起来像这样。
更新答案
不对,你用错了方法。当您知道只有 1 行将到达该步骤时,您可以使用设置变量步骤,当您有多行到达您的 "Result set" 时,您需要使用复制行 > 对每一行执行方法。这需要执行 1 个作业和 2 个 KTR。
您的工作将如下所示:
您的第一个 KTR 的最后一步将是 'Copy Rows to Result'。
在任务中,您需要这样配置您的第二个 KTR 条目:
Stream 列名必须与包含要执行的查询的第一个 KTR 中的相同列名匹配,第二个 KTR(第一个答案图片)中的命名参数必须与 JOB 配置中的参数匹配图片显示。
之后你所要做的就是在第二个KTR上为每个查询生成一个动态文件名,通常所有生成文件的输出步骤都有一个'Include date in filename'和一个'Include time in filename',使用两者应该足以以零努力生成不同的文件名,并且您会获得文件创建时间的时间戳。
我想执行一组基于 select 的 sql 查询,这些查询源自 XML 文件中的 xml-node 元素,并写入值CSV 文件中的相应结果集。我想澄清一下 sql 查询的任何字段都没有被参数化,但是完整的 sql 查询本身是参数化的。
获取完整 sql 查询的部分已按预期完成,但我不知道如何继续启动 sql 查询的部分,以便我可以获得相应的稍后管理它的结果集。
到目前为止,我尝试过的方法如下:
Execute SQL script
步骤:按照here的说法,这种步骤不会得到任何结果集。Dynamic SQL Row
步骤:只要我硬编码字段'TemplateSQL',我就得到了相应的sql,但我不能那样做,因为sql 从上一步派生的查询在它们之间非常不同,并且不提供固定的元数据方案。Table Input
步骤:此步骤仅允许参数化 sql 查询的单个值,而不是完整查询。
如果有 pentaho-kettle 专家能告诉我完成我想做的任务的正确方法,我将不胜感激。
更新(遵循@Cristian Curti 说明): 问题出现在 KTR-1 中。当你说 "you have to pass this query as a variable to another 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
步骤只希望收到一行。
我不知道我是做错了什么还是遗漏了什么。如果您需要更多详细信息,请告诉我。谢谢。
根据您分享的 link,按照 Rishu 的回答,第 2 部分进行操作。
在您从 XML 节点获取查询的部分,您必须将此查询作为变量传递给另一个 KTR,并且在第二个 KTR 的输入 Table 步骤中, 在步骤的 SQL 编辑器中使用 ${variable}。
应该看起来像这样。
更新答案
不对,你用错了方法。当您知道只有 1 行将到达该步骤时,您可以使用设置变量步骤,当您有多行到达您的 "Result set" 时,您需要使用复制行 > 对每一行执行方法。这需要执行 1 个作业和 2 个 KTR。
您的工作将如下所示:
您的第一个 KTR 的最后一步将是 'Copy Rows to Result'。
在任务中,您需要这样配置您的第二个 KTR 条目:
Stream 列名必须与包含要执行的查询的第一个 KTR 中的相同列名匹配,第二个 KTR(第一个答案图片)中的命名参数必须与 JOB 配置中的参数匹配图片显示。
之后你所要做的就是在第二个KTR上为每个查询生成一个动态文件名,通常所有生成文件的输出步骤都有一个'Include date in filename'和一个'Include time in filename',使用两者应该足以以零努力生成不同的文件名,并且您会获得文件创建时间的时间戳。