利用KETTLE进行数据迁移(改良版)

来源:互联网 发布:ug8.0数控编程实例 编辑:程序博客网 时间:2024/06/05 22:36

原文地址: http://ainidehsj.iteye.com/blog/1735434


我用Kettle 6.1,从 Mysql到Oracle  存在一下问题:

1、 字段类型不一致,没有主键约束;

2、 当源表数据为空时,就会报空指针异常(据了解,其他版本可能也存在这种问题)


问题原因:

在Java代码中获取的sql就和原本的表字段属性不一致了(大部分在Oracle中无法识别的属性,自动改成了 VARCHAR2(2000)),并且没有主键约束。


解决方案:

将原文中的“入库表结构创建”改成以下 转换流程:

输入:

字段选择:

建表

public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException{    // First, get a row from the default input hopObject[] r = getRow();org.pentaho.di.core.database.DatabaseMeta dbmeta = null;    System.out.println( getTrans().getRepository());java.util.List list = getTrans().getRepository().readDatabases();if(list != null && !list.isEmpty()){for(int i=0;i<list.size();i++){dbmeta = (org.pentaho.di.core.database.DatabaseMeta)list.get(i);            //161_orcl_cpsdw 为数据库名称if("161_orcl_cpsdw".equalsIgnoreCase(dbmeta.getName())){break;}}}if(dbmeta!=null){org.pentaho.di.core.database.Database db=new org.pentaho.di.core.database.Database(dbmeta);try{db.connect();String sql = get(Fields.In, "tableSql").getString(r);if(sql.trim().length()>0){db.execStatement(sql.replace(";", "").replaceAll("DEFAULT NULL", "").replaceAll("ENGINE=InnoDB DEFAULT CHARSET=utf8", "").replaceAll("`", "").replaceAll("int", "number").replaceAll("decimal", "number")//这里对表名进行了修改replaceAll("tlk_", "cpmt_").replaceAll("datetime", "date").replaceAll("varchar", "varchar2").replaceAll("tlk_", "cpmt_").replaceAll("bit", "char").replaceAll("longtext", "varchar2(2000)"));}}catch(Exception e){logError("创建表出现异常",e);}finally{db.disconnect();}}return false;}
                                             
0 0
原创粉丝点击