Kettle之【执行SQL脚本】控件用法

版本:kettle6.1

控件:执行SQL脚本

 

该控件可以执行一个update语句,用来更新某个表中的数据,

如果不带条件,就很简单,把SQL语句粘贴到控件中,设置好数据库连接即可

如果需要带条件执行,则需要进行一些设置。入下图,是一种常用的设置方法

需要设置的地方有:

1、勾选“变量替换”

2、勾选“执行每一行?”

3、勾选“Bind parmaters?”

4、在where条件中,使用?(问号)来代替参数

 

下面逐一分析这几个复选框的用法与意义

1、变量替换

只有勾选了这个复选框,sql中的where条件才能实现动态参数替换,这时候,有两种用法,

1)如果仅仅勾选“变量替换”,则sql语句中,只能使用变量来替换,而不能用传的参数,即只能用${V_TABLE_NAME},而且,如果字段为字符型,还必须加单引号,即UPDATE语句需要写成如下:

UPDATE bi_cdc_time SET CURRENT_LOAD=SYSDATE WHERE TABLE_NAME ='${V_TABLE_NAME}'

2)如果勾选了“执行每一行”,这时候,左下角的参数才可以编辑,则可以从上一个步骤的数据流中或者数据作为条件

 

2、执行每一行

勾选“执行每一行”后,就可以在UPDATE语句中使用?来代替变量名了。当然,前一种使用变量替换方式(${V_TABLE_NAME}),仍然可用。而且,第三个复选框“Bind parmaters”变为可用。

注意条件的顺序必须和传入的参数字段一致,如果条件中重复使用了条一个值,则必将该字段复制成额外的一个列,然后传入

1)不勾选“Bind parmaters”:意思为绑定变量,此时如果字段为字符类型,则还是需要在问号两端加单引号,如果是数值类型,则不需要,即SQL语句如下:

UPDATE bi_cdc_time SET CURRENT_LOAD=SYSDATE WHERE TABLE_NAME ='?'

不勾选“Bind parmaters”还有一个功能就是可以实现表名的替换,即把表名也换成问号,用传入参数替换,例如:

UPDATE ? SET CURRENT_LOAD=SYSDATE WHERE TABLE_NAME ='?'

甚至可以把整个SQL语句都作为一个参数出入,这个是绑定变量无法做到的。

2)勾选“Bind parmaters”:此时字段为字符类型时,问号两端不能加单引号,加了单引号会报无效的列索引的错误,即SQL语句为:

UPDATE bi_cdc_time SET CURRENT_LOAD=SYSDATE WHERE TABLE_NAME =?

 

3、Quotes String 

该选项与“Bind parmaters”选项只能选一个,勾选该选项的作用是,在替换的变量前后两端加上单引号,并且对于特殊字符进行转义,比如条件值中,有单引号时,kettle会自动在单引号前再加一个单引号(在两端单引号的基础上),例如,条件值是'ABC(注意前面的单引号)

UPDATE bi_cdc_time SET CURRENT_LOAD=SYSDATE WHERE TABLE_NAME =?会被替换成

UPDATE bi_cdc_time SET CURRENT_LOAD=SYSDATE WHERE TABLE_NAME ='''ABC'然后在数据库中执行

当然绑定变量也能达到同样的效果,但是原理不一样,绑定变量是预编译的SQL然后传入参数