kettle转换中的各个组件是并行的关系,job中是有先后顺序的,这样就可能会遇到一种情况——我想在某个步骤完成后再执行下面的步骤,这时该怎么办呢?那么这时就可以用到【阻塞数据】和【阻塞数据直到完成】两个组件;
【阻塞数据】:这个组件只允许前一个步骤的最后一条数据通过,这个往往和【执行SQL脚本】组件 并用;
【阻塞数据直到完成】:这个组件会将所设置的被阻塞步骤的所有数据堵住,当被阻塞的步骤完成后,才会将被阻塞步骤的所有数据往下一个步骤推;
注:虽然阻塞了,但是阻塞之后的步骤仍然在运行,即运行时间仍然在进行;
【执行SQL脚本】:
这个组件是一个相对比较复杂的组件,在转换中这个组件是运行优先级很高的组件,如果不勾选{执行每一行}这个选项,那么该组件就只会执行一次,勾选了这个选项那么执行次数就是前一个步骤的数据条目数;如果想实现该组件只在最后一步执行一次,那么可以这样来操作
【注】:此时别忘了勾选{执行每一行}这个选项,这个流程的逻辑就是当【表输出】完成后,将其的最后一条数据推过【阻塞数据】,然后执行【执行SQL脚本】,因为勾选了{执行每一行}这个选项,又因为【阻塞数据】只有一条数据,那么【执行SQL脚本】只执行一次;
另外【执行SQL脚本】还有一些其他的选项,如{变量替换}等;
一、当要使用变量时必须勾选{变量替换}这个选项,如果只勾选这个选项,那么变量只能使用${变量名}这样的,且当变量值为字符串时,必须要加单引号,如‘${变量名}’,否则会报错;
二、如果要使用前面步骤的值,那么必须要同时勾选{执行每一行},{变量替换},这时使用变量可以用?代替,这样你才可以编辑下面的参数;
但是还是有几种情况:1.当勾选了{Bind parmaters}时(也就是绑定变量),这时仍然可以使用${变量名}这种方式但字符串时必须要加单引号,但是?就不管值是否是字符串都不用加单引号,否则报错;
2.如果不勾选{Bind parmaters},那么?为字符串是必须加单引号;你可你这样理解,不勾选{Bind parmaters},把?的值当成数字来处理,此时当?为数字或者sql中的中的字段或者sql语句;而勾选了{Bind parmaters},那么就把?的值当成一个带有单引号的字符串;
3.{Quotes String },该选项与“Bind parmaters”选项只能选一个,勾选该选项的作用是,在替换的变量前后两端加上单引号,并且对于特殊字符进行转义,比如条件值中,有单引号时,kettle会自动在单引号前再加一个单引号(在两端单引号的基础上),如想要在数据库中输入‘wang,那么输入的时候就要这样‘‘‘wang‘,第一个和最后一个单引号是标明为字符串,第二个单引号起到的作用是转义符,第三个才是真正需要的文本单引号;此时变量用?,不要加单引号;
注:?的顺序就是你在{参数}选项中编辑的字段的顺序;
若想使用${参数名},那么无论怎么选择当其值只能被当做字符串时必须加单引号,值只能是数字和字符串;
原文地址:http://blog.51cto.com/13602563/2170921