一、实现目标

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

  

一、准备工作

源数据库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. Tomcat报错:Failed to start component [StandardEngine[Catalina].StandardHost[localhost]]

    Failed to start component [StandardEngine[Catalina].StandardHost[localhost]] 解决办法: 1,检测你的web.xml.去掉所 ...

  2. Delphi常用关键字用法详解

    本文详细介绍了Delphi中常用的各个关键字名称及用法,供大家在编程过程中借鉴参考之用.详情如下: absolute: ? 1 2 3 4 5 6 7 8 9 10 //它使得你能够创建一个新变量, ...

  3. kaungbin_DP S (POJ 3666) Making the Grade

    Description A straight dirt road connects two fields on FJ's farm, but it changes elevation more tha ...

  4. online_jf.lua --累计在线时间领取物品(积分)的lua脚本

    原作者: ayase 8-27修正 修复首次使用后的红字不需要额外进数据库导入计分表,这lua全自动生成 ----------------------------------------------- ...

  5. 041. asp.net中内容页访问母版页中的控件

    母版页运行机制: 用户通过输入内容也的URL来请求某个页面, 获取该页面后, 读取@Page指令, 如果该指令引用了一个母版页, 则也读取该母版页, 如果也是第一次请求这两个页面, 则母版页和被请求的 ...

  6. RabbitMQ3.6.3集群搭建+HAProxy1.6做负载均衡

    目录 [TOC] 1.基本概念 1.1.RabbitMQ集群概述   通过 Erlang 的分布式特性(通过 magic cookie 认证节点)进行 RabbitMQ 集群,各 RabbitMQ 服 ...

  7. log4j.properties 详解与配置步骤

    一.log4j.properties 的使用详解 1.输出级别的种类 ERROR.WARN.INFO.DEBUGERROR 为严重错误 主要是程序的错误WARN 为一般警告,比如session丢失IN ...

  8. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:5.安装Oracle RAC FAQ-RAC安装DB软件runInstaller看不到节点

    集群安装正常: [root@kmdbrac1 ~]# crs_stat -t -v Name Type R/RA F/FT Target State Host -------------------- ...

  9. ruby 生成有条件限制的随机数

    #conding:utf-8 #生成只有数字的随机码可控制长度def random_int(len) newpass = "" 1.upto(len){ |i| newpass & ...

  10. php5.3到php7.0.x新特性介绍

    <?php /*php5.3*/ echo '<hr>'; const MYTT = 'aaa'; #print_r(get_defined_constants()); /* 5.4 ...