java 代码
- /*******************************************************************************
- * @author danlley
- * @version 1.06.06.12
- * @since 2006-06-12
- * <p>Description: 此类用于分析客户库之间,或者开发库与客户库之间出现的不一致问题!
- * 要比较两个库中的数据之间差异,只需对常量:DATABASE_A
- * DATABASE_B
- * 修改成所需批对的数据库即可。
- * 注意: 在整个处理过程中,表和视图完全按照同一概念处理.</p>
- *******************************************************************************/
- 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_length<>b.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);
- }
- }
- /**
- * <p>Title: 内部类</p>
- * <p>Description:由于在处理过程中将会大量用到字段名称和字段类型,此处如果新建一个类
- * 去处理由于仅仅包含五个对象属性,因此有些得补偿失,所以采用内部类,
- * 这样:
- * 首先省去了建一个新的class
- * 解决了代码重复定义和使用的臃肿现象
- * 此内部类中包含五个对象属性:
- * T_NAME 表名
- * C_NAME 字段名称
- * C_TYPE 字段类型
- * C_SIZE 字段大小
- * CC_SIZE 被比对字段大小</p>
- * @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+"中也存