一、实现目标

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

  

一、准备工作

源数据库ORACLE  目标数据库MongoDB,在源数据库添加删除、更新触发器

二、操作步骤

  1. 添加表输入组件,连接ORACLE触发器记录表
  2. 添加JAVA代码组件,进行步骤跳转,根据输入的数据判断是删除或者更新,如果是删除,则跳转至MongoDB Delete步骤中,如果是更新的话,跳转至字段选择步骤中。JAVA代码中的详细信息如下:
  3. 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实现数据的删除和更新的更多相关文章

  1. [原创]MYSQL中利用外键实现级联删除和更新

    MySQL中利用外键实现级联删除.更新 MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定 ...

  2. MySQL中利用外键实现级联删除、更新

    MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定在删除.更新父表时,对子表进行的相应操作 ...

  3. 0011《SQL必知必会》笔记07 数据的插入、更新和删除

    1.插入完整的行或一部分:INSERT INTO 表名(列名1-n) VALUES (对应的值1-n) INSERT INTO products(prod_id, vend_id, prod_name ...

  4. SQL Server XML基础学习之<7>--XML modify() 方法对 XML 数据中插入、更新或删除

    /*------------------------------------------------------------------------------+ #| = : = : = : = : ...

  5. 转载---SQL Server XML基础学习之<7>--XML modify() 方法对 XML 数据中插入、更新或删除

    /*------------------------------------------------------------------------------+ #| = : = : = : = : ...

  6. DML数据操作语言之增加,删除,更新

    1.数据的增加 数据的增加要用到insert语句  ,基本格式是: insert into <表名> (列名1,列名2,列名3,......) values (值1,值2,值3,..... ...

  7. python对MySQL进行数据的插入、更新和删除之后需要commit,数据库才会真的有数据操作。(待日后更新)

    今天在尝试用下面的python代码对MySQL进行数据的插入.更新和删除时, 突然发现代码执行成功, 通过代码查询也显示数据已经插入或更新, 但是当我在MySQL客户端通过SQL语句查询时, 数据库中 ...

  8. arcengine,深入理解游标Cursors,实现数据的快速查找,插入,删除,更新

    风过无痕 原文  arcengine,深入理解游标Cursors,实现数据的快速查找,插入,删除,更新 深入理解游标Cursors,实现数据的快速查找,插入,删除,更新 1.查找数据Search Cu ...

  9. mysql DML 数据插入,删除,更新,回退

    mysql插入,删除,更新地址:https://wenku.baidu.com/view/194645eef121dd36a32d82b1.html http://www.cnblogs.com/st ...

随机推荐

  1. ubuntu 14.04安装nginx+php+mysql

    前段时间的折腾,颇费一番周折,过程中发现网上的许多资料比较老旧过时了,所以在这里也简单把过程重新整理一遍,争取一帖解决问题. 基于最新的Ubuntu 14.04(2014年9月)搭建nginx.php ...

  2. input中加入搜索图标

    刚吃了一份宫保鸡丁刀削面,幸福感满满,写篇博客消耗一下热量. 今天工作遇到的一个问题是在input输入框中加入图标,当输入内容后,图标和提示语一起隐藏,类似于placeholder的功能.如淘宝页面, ...

  3. 1.5 linux笔记

    fdisk /dev/sda   查看sda下硬盘状态 fdisk l 看LIST所有文件系统 fdisk n 创建分区 fdisk m help fdisk p 查看所有分区 fdisk w 保存分 ...

  4. 【耐克】【空军一号 Nike Air Force 1】【软木塞】

     [高帮 全白 36-45] [空军一号 低帮 36-46] [空军一号 36-45] [Nike Air Force 1 Flyknit 空军中帮飞线系列 全黑 36-44] [耐克空军一号 软木塞 ...

  5. CentOS7关闭防火墙方法

    在之前的版本中关闭防火墙等服务的命令是 service iptables stop /etc/init.d/iptables stop 在RHEL7中,其实没有这个服务 [root@rhel7 ~]# ...

  6. catalog备份数据库及RMAN存储脚本

    环境说明: 提前配置好两个库的监听与tnsnames.oraIP:10.100.25.13 为目标数据库  IP:10.100.25.14 为恢复目录数据库(catalog database) 以下操 ...

  7. Hadoop学习笔记

    今天开始要学习Hadoop!开始向"大数据"领域靠拢! 从头开始对于连何为Hadoop都不清楚的人,有好多东西要学,加油! 1.下载hadoop,官网地址:http://mirro ...

  8. linux for循环更改文件名字

    #!/bin/bash # for a in CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo Ce ...

  9. kvm虚拟化平台搭建入门

    KVM虚拟化有两种网络模式:1)Bridge网桥模式2)NAT网络地址转换模式Bridge方式适用于服务器主机的虚拟化.NAT方式适用于桌面主机的虚拟化. 环境: 本次实验要开启VMWare中对应Ce ...

  10. WebService 错误:无法加载协定为xxx的终结点配置部分,因为找到了该协定的多个终结点配置

    当在vs 2008中添加服务引用后,如果“更新”服务引用,或“删除”该服务引用后再次加入后,在运行时会出现此错误.这是因为在“更新/删除”服务引用时,app.config文件并不会自动修改,在“更新” ...