免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1043 | 回复: 0
打印 上一主题 下一主题

【原创】Oracle数据库表结构分析程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-25 09:23 |只看该作者 |倒序浏览
/*******************************************************************************
* @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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP