在Pentaho(PDI)中使用Call db过程步骤时使用自定义数量的参数

时间:2018-10-17 14:28:43

标签: plsql pentaho pentaho-spoon pentaho-data-integration

说明:

最近,我一直在尝试使用Pentaho(PDI)使工作中的某些任务自动化,而且遇到一个问题,我没有运气来解决/查找解决方案(我做了很多小时的研究,也可以自己解决)。我的目的是加载一个文本文件,其中包含存储在服务器上的PL / SQL过程的名称,以及该过程的自定义参数量。例如,如果源文本文件将包含以下文本:

  

Test_schema.job_pkg.run_job; 12345

它应该从定义的连接运行job_pkg.run_job过程,并将12345用作单个参数。

问题:

Call DB procedure转换步骤仅接受SET大量的参数,例如,我将步骤设置为接受4个参数,但是我正在调用的过程仅接受1个参数。我希望能够忽略在该步骤中设置的其他参数。例如,当我尝试仅发送一个参数但将该步骤设置为接受4个参数时,它将抛出:

  

致电DB Procedure.0-ORA-06550:第1行,第7列:

     

PLS-00306:调用“ RUN_JOB”时参数的数量或类型错误

     

ORA-06550:第1行,第7列:PL / SQL:语句已忽略

我到目前为止所拥有的:

我做了一个工作,开始进行转换,将源文件的内容加载到内存中,使用Modified Java Script value将其拆分为正确的字段,为Pentaho变量设置额外的值,然后加载第二个转换,读取这些变量并将它们作为字段传递到Call DB procedure步骤。除非我手动删除所有未使用的参数,否则最后一步总是失败。

My current settings for Call DB Procedure step

解决方案:

根据 AlainD 的回答,我尝试使用Switch / Case步骤来解决问题。现在,存在关于值转换的不同问题。如果我传递数字但在Call DB Procedure的参数中将其设置为STRING,则会抛出

  

ORA-01403找不到数据

可以通过“修改的Java脚本值”步骤或任何其他步骤处理数据以将数据转换为“正确”格式来解决此问题。

Final transformation view

1 个答案:

答案 0 :(得分:1)

在这种情况下,我要做的是在字符串中构建一个SQL命令,类似于Test_schema.job_pkg.run_job(12345),并使用Execute SQL script执行它。

另一种解决方法是在Modified Javascript步骤中控制参数数量,并使用Switch/Case在一系列DB Procedure步骤中重定向流:一个参数为0 ,一个带有1个参数,一个带有2个参数,......此方法假定最大参数数量很小。