第二种循环源文件下载:
connection_reset.rar
介绍两种循环方式,一种是官方自带例子,通过job组件执行每一行来循环,第二种通过javaScript脚本组件循环,同时可以解决接oracle数据库报错Connection reset的问题
1.kettle8官方案例
文件位置:$KETTLE_HOME/samples/jobs/process all tables
这个例子是先获取数据库中的所有表名,统计表格表的数据条数,最后输出到txt上
包含文件和作用:
流程控制总job
transformation(转换):Get list of tables as result
组件1:get list of tables
自带数据库连接
组件2:Concat Fields
把TABLE_SCHEMA字段和TABLE_NAME拼接成一个字段TABLE_SCHEMA_NAME,分隔符为英文句号
组件3:tables.txt
查询出来的表名称TABLE_NAME输出到txt
输出的文件路径,可以把鼠标移动到上面就会显示
组件4:Select values
只选择一个字段TABLE_SCHEMA_NAME并且重命名成tablename
组件5:Copy rows to result
把表名称复制到结果集上,在下一个transformaton里面可以使用Get rows from result获取到结果集
Job(作业):Process a table
前面一个transformation获取到5条数据,数据到Process a table 这个job上需要勾选执行每一条数据,这点就是循环的关键
transformation(转换):Define TABLE variable
组件1:get one tablename
组件2:set ${TABLENAME}
transformation(转换):Get amount of rows from table
组件1:Number of rows in ${TABLENAME}
组件2:rows-${TABLENAME}.txt
查询到一个结果输出到一个txt上,文件名为${java.io.tmpdir}/rows-${TABLENAME}
输出结果为:
transformation(转换):save list of all result files
把输出的txt合并成一个,该例子有点问题需要修改一下才行,做循环的话这部分可以忽略
2.通过job step里的JavaSrcipt 组件构建循环
这个例子是自己写的,主要功能是连接oracle数据库时发生 ‘Connection reset by peer’ or ‘Connection reset’ 的错误
作业如下:
其中js代码
var count;
var count_max;
//获取当前循环次数
count = parent_job.getVariable("EP_V_ID");
//获取允许的最大循环次数
count_max = parent_job.getVariable("EP_V_MAX_ID");
//当前次数等于最大循环次数
if(count == count_max){
//返回false给js脚本组件,js脚本组件往红色线执行
false;
}else{
//当前循环次数加1
count = parseInt(count) + 1;
//替换jvm中的循环次数
parent_job.setVariable("EP_V_ID", count);
//返回true给js脚本组件,js脚本组件往绿色线执行
true;
}
相当于如下循环:
for(int i=0;i++){
if(数据库连接成功) break;
if(i==5) break;
print(“数据库连接信息”)
这种方式也可以循环便利数组,js中数组的使用方法具体的可以参考官网上的js脚本说明