KETTLE实现数据的删除和更新
一、实现目标
源数据库的数据更新或者删除之后,目标数据库的数据跟着更新或删除,整体流程截图如下:

一、准备工作
源数据库ORACLE 目标数据库MongoDB,在源数据库添加删除、更新触发器
二、操作步骤
- 添加表输入组件,连接ORACLE触发器记录表
- 添加JAVA代码组件,进行步骤跳转,根据输入的数据判断是删除或者更新,如果是删除,则跳转至MongoDB Delete步骤中,如果是更新的话,跳转至字段选择步骤中。JAVA代码中的详细信息如下:
import java.util.List; import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.row.RowDataUtil;
import org.pentaho.di.core.row.RowMeta;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.core.row.ValueMeta;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransMeta; private Object[] previousRow;//上一行
private RowSet t1 = null;//业务表步骤
private RowSet t2 = null;//删除步骤 public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException
{
Object[] r = getRow(); //获取输入行 if ( first ) {
if ( getInputRowMeta() == null ) {
setOutputDone();//设置输出完成
return false;
}
} if ( r == null ) { // 如果当前行为null
if ( previousRow != null ) {//如果上一行不为null
//是最后一行 boolean valid=true;
previousRow = createOutputRow(previousRow, data.outputRowMeta.size());
Trans trans=getTrans();//获取转换实例
if (trans != null){
String sync_val = get(Fields.In, "ID").getString(previousRow);//获取ID
trans.setVariable("LAST_SYNC_VAL", sync_val);//设置变量的值
}
String OpType = get(Fields.In, "DATATYPE").getString(previousRow);//获取操作类型是删除还是更新
String keyid= get(Fields.In, "DATAID").getString(previousRow);//获取操作类型是删除还是更新 //Object[] rowData = RowDataUtil.allocateRowData(data.outputRowMeta.size());
//get(Fields.Out, "KEYID").setValue(rowData,keyid);
//putRowTo(data.outputRowMeta, previousRow,t2); if(OpType.equals("UPDATE")){//验证通过
putRowTo(data.outputRowMeta, previousRow,t1);
}
else
{
putRowTo(data.outputRowMeta, previousRow,t2);
} }
setOutputDone();//设置输出完成
return false;//返回false表示不用再继续处理processRow
} if ( !first ) {//不是第一次执行,因为第一次执行时previousRow一定是Null
//不是最后一行
boolean valid=true;
String OpType = get(Fields.In, "DATATYPE").getString(previousRow);//获取操作类型是删除还是更新
String keyid= get(Fields.In, "DATAID").getString(previousRow);//获取操作类型是删除还是更新 //Object[] rowData = RowDataUtil.allocateRowData(data.outputRowMeta.size());
//get(Fields.Out, "KEYID").setValue(rowData,keyid);
//putRowTo(data.outputRowMeta, previousRow,t2);
if(OpType.equals("UPDATE")){
putRowTo(data.outputRowMeta, previousRow,t1);
}
else
{
putRowTo(data.outputRowMeta, previousRow,t2);
}
}
previousRow = r;//把当前行设为下一次执行的上一行
if ( first ) {//如果是首次执行
first = false;
t1 = findTargetRowSet("dataupdate");//业务表步骤
t2 = findTargetRowSet("datadelete");//数据删除步骤
} return true;//返回true表示还要继续处理processRow
}3.如果跳转至了MongoDB Delete,则根据ID对目标库进行删除。Mongodb delete组件配置如下:

JSON query中的{ID:"?{DATAID}"}表示删除ID等于传进来的参数DATAID的所有数据,Execute for each row要选择上,表示执行每一行数据。
4.如果通过JAVA代码2判断为更新的话,则流程将跳转至字段选择组件,只获取主键ID,此步骤非常重要,因为要根据ID去源表中获取等更新的那条数据。

5.选择表输入组件,该步骤是根据上一步传入的ID获取待更新的那一条数据

PS:获取SQL查询语句:此处写入SQL语句,里边的?是变量替换,下边要勾选上"替换SQL语句里的变量",从步骤插入数据要选择上一步,勾选上执行每一行。
6.下边的步骤:流查询、JAVA代码是对数据进行清洗,字典替换,此处不再解释
7.最后一步:Mongodb output输出需要详细设置

output options选项卡勾选update modifier update

Mongo文档字段配置:ID为主键匹配字段,匹配字段更新为Y 修改器设置为N/A表示不对主键更新
KETTLE实现数据的删除和更新的更多相关文章
- [原创]MYSQL中利用外键实现级联删除和更新
MySQL中利用外键实现级联删除.更新 MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定 ...
- MySQL中利用外键实现级联删除、更新
MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定在删除.更新父表时,对子表进行的相应操作 ...
- 0011《SQL必知必会》笔记07 数据的插入、更新和删除
1.插入完整的行或一部分:INSERT INTO 表名(列名1-n) VALUES (对应的值1-n) INSERT INTO products(prod_id, vend_id, prod_name ...
- SQL Server XML基础学习之<7>--XML modify() 方法对 XML 数据中插入、更新或删除
/*------------------------------------------------------------------------------+ #| = : = : = : = : ...
- 转载---SQL Server XML基础学习之<7>--XML modify() 方法对 XML 数据中插入、更新或删除
/*------------------------------------------------------------------------------+ #| = : = : = : = : ...
- DML数据操作语言之增加,删除,更新
1.数据的增加 数据的增加要用到insert语句 ,基本格式是: insert into <表名> (列名1,列名2,列名3,......) values (值1,值2,值3,..... ...
- python对MySQL进行数据的插入、更新和删除之后需要commit,数据库才会真的有数据操作。(待日后更新)
今天在尝试用下面的python代码对MySQL进行数据的插入.更新和删除时, 突然发现代码执行成功, 通过代码查询也显示数据已经插入或更新, 但是当我在MySQL客户端通过SQL语句查询时, 数据库中 ...
- arcengine,深入理解游标Cursors,实现数据的快速查找,插入,删除,更新
风过无痕 原文 arcengine,深入理解游标Cursors,实现数据的快速查找,插入,删除,更新 深入理解游标Cursors,实现数据的快速查找,插入,删除,更新 1.查找数据Search Cu ...
- mysql DML 数据插入,删除,更新,回退
mysql插入,删除,更新地址:https://wenku.baidu.com/view/194645eef121dd36a32d82b1.html http://www.cnblogs.com/st ...
随机推荐
- jquery设置下拉菜单
jQuery代码 1,引用jQuery库 2,show方法 3,hide方法 <script type="text/javascript"> $function(){ ...
- 如何修改WAMP中mysql默认空密码
WAMP安装好后,mysql密码是为空的,那么要如何修改呢?其实很简单,通过几条指令就行了,下面我就一步步来操作. 首先,通过WAMP打开mysql控制台. 提示输入密码,因为现在是空,所以直接按 ...
- 安装Adobe系列时遇到的问题解决
安装错误,错误摘要如下: Exit Code: 6 Please see specific errors below for troubleshooting. For example, ERROR: ...
- CSS布局奇技淫巧:各种居中
居中是我们使用css来布局时常遇到的情况.使用css来进行居中时,有时一个属性就能搞定,有时则需要一定的技巧才能兼容到所有浏览器,本文就居中的一些常用方法做个简单的介绍. 注:本文所讲方法除了特别说明 ...
- 强制span不换行
对于上一篇提到的overflow的问题我好像搞懂一些了.事情大概是这个样子的:如果用了float属性,那么元素就会脱离文本的束缚,无法无天起来,这肯定是猿类无法忍受的.要想让他们乖乖就范,要么用清除浮 ...
- 042. asp.net使用缓存来提高母版页的访问性能
Asp.Net缓存技术是一项非常重要的技术, 当一个页面被频繁的访问, 如果不使用缓存技术, 那么每访问一次就要回发一次服务器, 显然这样对服务器造成很大的负担, 所以, 可以在被频繁访问的页面中设置 ...
- java1234教程系列笔记 S1 Java SE chapter 02 写乘法口诀表
一.水仙花数 1.方式一:这是我的思路,取各个位数的方式.我个人习惯于使用取模运算. public static List<Integer> dealNarcissiticNumberMe ...
- 在工作有时候centos6.5系统使用rpm包安装mysql5.7出现的问题
首先说明一下,我用的CentOS版本是6.6,64位.打印机驱动程序是两个rpm安装包:cndrvcups-common-2.60-1.x86_64.rpm和cndrvcups-capt-2.60-1 ...
- 配置点云库PCL时遇到的问题
配置PCL基本参照PCL中国官网教程 http://www.pclcn.org/study/shownews.php?lang=cn&id=34 配置点云库时遇到的问题(基于win8 64位, ...
- 提供VR定制开发、AR定制开发(VR游戏定制、应用定制)
设置输出路径 添加烘培输出的贴图类型 添加“LightingMap”类型 设置烘培贴图大小和目标贴图位置为“自发光” 设置烘培材质,选择“输出到源” 点击“渲染”即可 24.标准材质贴图的烘培光影处理 ...