- 论坛徽章:
- 0
|
/*******************************************************************************
* @author danlley
* @version 1.06.06.12
* @since 2006-06-12
* Description: 此类用于分析客户库之间,或者开发库与客户库之间出现的不一致问题!
* 要比较两个库中的数据之间差异,只需对常量:DATABASE_A
* DATABASE_B
* 修改成所需批对的数据库即可。
* 注意: 在整个处理过程中,表和视图完全按照同一概念处理.
*******************************************************************************/
import java.util.Collection;
import java.util.ArrayList;
import java.util.Iterator;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.danlley.ora.DBConnection;//用于没有通过上下文进行连接数据库(属于简单连接方式)
public class CompareCertainDB{
/**
* 定义两个要进行比较的数据库名常量,可根据需要进行修改
*/
private static final String DATABASE_A="WLJW";
private static final String DATABASE_B="JWGL";
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
/**
* 说明:此方法用于比较两个不同库中是否有相同表名,相同字段名的字段中字段大小不一致的情况
* 如果有,则返回一个集合类用于保存查询结果.
* 其中,每条信息都保存在一个内部类 IntityClass 的属性 T_NAME , C_NAME ,
* C_SIZE , CC_SIZE 中.
* @return
* @throws java.lang.Exception
*/
public Collection com_comp_len_col_both_DB() throws Exception{
try{
ArrayList com_comp_len_col=new ArrayList();
StringBuffer strSQL=new StringBuffer();
strSQL.append("select a.atable_name,a.acolumn_name,a.adata_length,b.bdata_length from ");
strSQL.append(" (");
strSQL.append(" select table_name atable_name, column_name acolumn_name,data_length adata_length");
strSQL.append(" from all_tab_columns where owner='WLJW'");
strSQL.append(" )a,");
strSQL.append(" (");
strSQL.append(" select table_name btable_name, column_name bcolumn_name,data_length bdata_length ");
strSQL.append(" from all_tab_columns where owner='JWGL'");
strSQL.append(" )b ");
strSQL.append("where a.acolumn_name=b.bcolumn_name and ");
strSQL.append(" a.atable_name=b.btable_name and");
strSQL.append(" a.adata_lengthb.bdata_length");
conn=DBConnection.getConn();
System.out.println("++++++++++++++++++++++++++++++++++++++++++++++");
System.out.println(strSQL.toString());
System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++");
ps=conn.prepareStatement(strSQL.toString());
rs=ps.executeQuery();
while(rs.next()){
String T_NAME=null; //表名
String C_NAME=null; //字段名称
String C_SIZE=null; //字段大小
String CC_SIZE=null; //被比对字段大小
T_NAME=rs.getString("atable_name");
C_NAME=rs.getString("acolumn_name");
C_SIZE=rs.getString("adata_length");
CC_SIZE=rs.getString("bdata_length");
IntityClass intityClass=new IntityClass(T_NAME,C_NAME,C_SIZE,CC_SIZE);
com_comp_len_col.add(intityClass);
}
int size=com_comp_len_col.size();
com_comp_len_col.add(new IntityClass("大小不一致的字段共有:"+size+"个!",null,null,null));
return com_comp_len_col;
} catch(Exception e){
e.printStackTrace();
e.getMessage();
throw new Exception(e);
} finally{
DBConnection.close(rs);
DBConnection.close(ps);
DBConnection.freeConn(conn);
}
}
/**
* 说明:此方法用于比对在两个库同一名称的表中,字段名称在一个库中存在,而在另一个库中不存在的情况
* @param type 用来决定两个库的比对方式,此参数由 DATABASE_A 和 DATABASE_B
* 来取值.
* 如果类型为 DATABASE_A ,则查找 DATABASE_A 库中存在而
* DATABASE_B库中不存在的表.
* 如果类型为 DATABASE_B ,则查找 DATABASE_B 库中存在,而 DATABASE_A
* 库中不存在的情况.
* @return
* @throws java.lang.Exception
*/
public Collection compCols_in_one_notin_other(String type) throws Exception{
ArrayList diff_cols_li=new ArrayList();
try{
StringBuffer strSQL=new StringBuffer();
String typeA="";
String typeB="";
/********************************************
****** 决定查询方式 *******
********************************************/
if(CompareCertainDB.DATABASE_A.equals(type)){
typeA=CompareCertainDB.DATABASE_A;
typeB=CompareCertainDB.DATABASE_B;
}
if(CompareCertainDB.DATABASE_B.equals(type)){
typeB=CompareCertainDB.DATABASE_A;
typeA=CompareCertainDB.DATABASE_B;
}
strSQL.append("select table_name,column_name,data_type from ");
strSQL.append(" (");
strSQL.append(" select table_name,column_name,data_type from ");
strSQL.append(" (");
strSQL.append(" select table_name,column_name,data_type from all_tab_columns where owner='"+typeA+"'");
strSQL.append(" )");
strSQL.append(" where table_name in (select distinct(table_name) btablename from all_tab_columns where owner ='"+typeB+"')");
strSQL.append(" )B ");
strSQL.append(" where B.column_name not in (select column_name from all_tab_columns where owner ='"+typeB+"')");
conn=DBConnection.getConn();
System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
System.out.println(strSQL.toString());
System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++");
ps=conn.prepareStatement(strSQL.toString());
rs=ps.executeQuery();
String diff_cols=null;
while(rs.next()){
String T_NAME=null;
String C_NAME=null;
String C_TYPE=null;
T_NAME=rs.getString("table_name");
C_NAME=rs.getString("column_name");
C_TYPE=rs.getString("data_type");
IntityClass intityClass=new IntityClass(T_NAME,C_NAME,C_TYPE);
diff_cols_li.add(intityClass);
}
int size=diff_cols_li.size();
diff_cols_li.add(new IntityClass(null,"共有 "+size+" 个字段",null)); //);
return diff_cols_li;
} catch(Exception e){
e.printStackTrace();
e.getMessage();
throw new Exception(e);
} finally{
DBConnection.close(rs);
DBConnection.close(ps);
DBConnection.freeConn(conn);
}
}
/**
* Title: 内部类
* Description:由于在处理过程中将会大量用到字段名称和字段类型,此处如果新建一个类
* 去处理由于仅仅包含五个对象属性,因此有些得补偿失,所以采用内部类,
* 这样:
* 首先省去了建一个新的class
* 解决了代码重复定义和使用的臃肿现象
* 此内部类中包含五个对象属性:
* T_NAME 表名
* C_NAME 字段名称
* C_TYPE 字段类型
* C_SIZE 字段大小
* CC_SIZE 被比对字段大小
* @author danlley
* @version 1.0
*/
public static class IntityClass{
/**
* 以下三个属性主要用于用于比对字段类型,同时,除C_TYPE外,其余两属性还将用于
* 比对字段大小
*/
String T_NAME=null; //表名
String C_NAME=null; //字段名称
String C_TYPE=null; //字段类型
/**
* 下面3个字段与T_NAME,C_NAME一起用于比对字段大小
*/
String C_SIZE=null; //字段大小
String CC_SIZE=null; //被比对字段大小
/**
* 说明: 此方法用于比对字段类型
* @param T_NAME 表名
* @param C_NAME 字段名称
* @param C_TYPE 字段类型
*/
public IntityClass(String T_NAME,String C_NAME,String C_TYPE){
this.T_NAME=T_NAME;
this.C_NAME=C_NAME;
this.C_TYPE=C_TYPE;
}
/**
* 说明:此方法用于比对字段大小
* @param T_NAME 表名
* @param C_NAME 字段名称
* @param C_SIZE 字段大小
* @param CC_SIZE 被比对字段大小
*/
public IntityClass(String T_NAME,String C_NAME,String C_SIZE,String CC_SIZE){
this.T_NAME=T_NAME;
this.C_NAME=C_NAME;
this.C_SIZE=C_SIZE;
this.CC_SIZE=CC_SIZE;
}
}
/**
* 说明:此方法用于比较并返回两个库中属于一个库,但又不属于另一个库的表信息
* @param type 如果传入的参数为“DATABASE_A”,则找出WLJW中存在,但JWGL中不存在的表。
* 如果传入的参数为“DATABASE_B”,则找出JWGL中存在,但WLJW中不存在的表。
* @return
* @throws java.lang.Exception
*/
public Collection tabShldDel(String type) throws Exception{
try{
ArrayList dutyTabLi=new ArrayList();
StringBuffer strSQL=new StringBuffer();
String typeA="";
String typeB="";
/********************************************
****** 决定查询方式 *******
********************************************/
if(CompareCertainDB.DATABASE_A.equals(type)){
typeA=CompareCertainDB.DATABASE_A;
typeB=CompareCertainDB.DATABASE_B;
}
if(CompareCertainDB.DATABASE_B.equals(type)){
typeB=CompareCertainDB.DATABASE_A;
typeA=CompareCertainDB.DATABASE_B;
}
strSQL.append("select atablename from ");
strSQL.append(" (");
strSQL.append(" select distinct(table_name) atablename from all_tab_columns where owner like '%"+typeA+"%'");
strSQL.append(" )A ");
strSQL.append(" where A.atablename not in ( ");
strSQL.append("select distinct(table_name) btablename from all_tab_columns where owner ='"+typeB+"'");
strSQL.append(" ) ");
conn=DBConnection.getConn();
System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
System.out.println(strSQL.toString());
System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++");
ps=conn.prepareStatement(strSQL.toString());
rs=ps.executeQuery();
while(rs.next()){
String tableName=rs.getString("atablename");
dutyTabLi.add(tableName);
}
int size=dutyTabLi.size();
dutyTabLi.add("共有 "+size+" 张表");
return dutyTabLi;
} catch(Exception e){
e.printStackTrace();
e.getMessage();
throw new Exception(e);
} finally{
DBConnection.close(rs);
DBConnection.close(ps);
DBConnection.freeConn(conn);
}
}
/**
* 说明:用于返回两个库中的交集表信息
* @return
* @throws java.lang.Exception
*/
public Collection commonTabLi() throws Exception{
try{
ArrayList comTabLi=new ArrayList();
StringBuffer strSQL=new StringBuffer();
strSQL.append("select atablename from ");
strSQL.append(" ( ");
strSQL.append(" select distinct(table_name) atablename from all_tab_columns where owner='"+CompareCertainDB.DATABASE_A+"'");
strSQL.append(" )A ");
strSQL.append("where A.atablename in (select distinct(table_name) btablename from all_tab_columns where owner ='"+
CompareCertainDB.DATABASE_B+"')");
conn=DBConnection.getConn();
System.out.println("+++++++++++++++++++++++++++++++++++++++");
System.out.println(strSQL.toString());
System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
ps=conn.prepareStatement(strSQL.toString());
rs=ps.executeQuery();
String comTab=null;
while(rs.next()){
comTab=rs.getString("atablename");
comTabLi.add(comTab);
}
int size=comTabLi.size();
comTabLi.add("共有 "+size+" 张表");
return comTabLi;
} catch(Exception e){
e.printStackTrace();
e.getMessage();
throw new Exception(e);
} finally{
DBConnection.close(rs);
DBConnection.close(ps);
DBConnection.freeConn(conn);
}
}
/**
* 说明:程序处理入口
* @param args
*/
public static void main(String[] args){
try{
CompareCertainDB compCertDB=new CompareCertainDB();
System.out.println("==================================================");
System.out.println(" 以下为"+CompareCertainDB.DATABASE_A+"中存在但在"+CompareCertainDB.DATABASE_B+"中不存在的表 ");
System.out.println("==================================================");
Collection inWLJWnotJWGL=compCertDB.tabShldDel(CompareCertainDB.DATABASE_A);
Iterator iter_wljw=inWLJWnotJWGL.iterator();
String tabinWLJW=null;
while(iter_wljw.hasNext()){
tabinWLJW=(String)iter_wljw.next();
System.out.println(""+tabinWLJW);
}
System.out.println("==================================================\n\n\n\n");
System.out.println("==================================================");
System.out.println(" 以下为"+CompareCertainDB.DATABASE_B+"中存在但在"+CompareCertainDB.DATABASE_A+"中不存在的表 ");
System.out.println("==================================================");
Collection inJWGLnotWLJW=compCertDB.tabShldDel(CompareCertainDB.DATABASE_B);
Iterator iter_jwgl=inJWGLnotWLJW.iterator();
String tabinJWGL=null;
while(iter_jwgl.hasNext()){
tabinJWGL=(String)iter_jwgl.next();
System.out.println(""+tabinJWGL);
}
System.out.println("==================================================\n\n\n\n");
System.out.println("==================================================");
System.out.println(" 以下为"+CompareCertainDB.DATABASE_A+"中存在且在"+CompareCertainDB.DATABASE_B+"中也存在的表 ");
System.out.println("==================================================");
Collection inBothDB=compCertDB.commonTabLi();
Iterator iter_in_both=inBothDB.iterator();
String tabinBoth=null;
while(iter_in_both.hasNext()){
tabinBoth=(String)iter_in_both.next();
System.out.println(""+tabinBoth);
}
System.out.println("==================================================\n\n\n\n");
System.out.println(" 开始准备比较两个库中共有表的字段名称..... \n\n\n\n\n\n\n\n");
System.out.println("==================================================");
System.out.println(" 以下为"+CompareCertainDB.DATABASE_A+"中存在但在"+CompareCertainDB.DATABASE_B+"中不存在的字段信息 ");
System.out.println("==================================================");
Collection inWLJWnotJWGL_col=compCertDB.compCols_in_one_notin_other(CompareCertainDB.DATABASE_A);
Iterator iter_wljw_col=inWLJWnotJWGL_col.iterator();
IntityClass tabinWLJW_col=null;
while(iter_wljw_col.hasNext()){
tabinWLJW_col=(IntityClass)iter_wljw_col.next();
System.out.println(""+tabinWLJW_col.C_NAME+" "+tabinWLJW_col.C_TYPE+" "+tabinWLJW_col.T_NAME);
}
System.out.println("==================================================\n\n\n\n");
System.out.println("==================================================");
System.out.println(" 以下为"+CompareCertainDB.DATABASE_B+"中存在但在"+CompareCertainDB.DATABASE_A+"中不存在的字段信息 ");
System.out.println("==================================================");
Collection inJWGLnotWLJW_col=compCertDB.compCols_in_one_notin_other(CompareCertainDB.DATABASE_B);
Iterator iter_jwgl_col=inJWGLnotWLJW_col.iterator();
IntityClass tabinJWGL_col=null;
while(iter_jwgl_col.hasNext()){
tabinJWGL_col=(IntityClass)iter_jwgl_col.next();
System.out.println(""+tabinJWGL_col.C_NAME+" "+tabinJWGL_col.C_TYPE+" "+tabinJWGL_col.T_NAME);
}
System.out.println("==================================================\n\n\n\n");
System.out.println("==================================================");
System.out.println(" 以下为"+CompareCertainDB.DATABASE_B+"和"+CompareCertainDB.DATABASE_A+"大小不一致的字段信息 ");
System.out.println("==================================================");
Collection JWGLandWLJW_col=compCertDB.com_comp_len_col_both_DB();
Iterator iter_both_col=JWGLandWLJW_col.iterator();
IntityClass tabinboth_col=null;
System.out.println(" 表名 字段名 字段大小"+CompareCertainDB.DATABASE_A+" 被比对字段大小"+CompareCertainDB.DATABASE_B+"");
while(iter_both_col.hasNext()){
tabinboth_col=(IntityClass)iter_both_col.next();
System.out.println(" "+tabinboth_col.T_NAME+" "+tabinboth_col.C_NAME+" "+tabinboth_col.C_SIZE+" "+tabinboth_col.CC_SIZE);
}
System.out.println("=====================================================\n\n\n\n");
} catch(Exception e){
e.printStackTrace();
e.getMessage();
}
}
}
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/22374/showart_160283.html |
|