设为首页 收藏本站
查看: 848|回复: 0

[经验分享] Oracle数据库表结构分析程序

[复制链接]

尚未签到

发表于 2016-8-8 06:46:12 | 显示全部楼层 |阅读模式
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+"中也存

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-254435-1-1.html 上篇帖子: Oracle存储过程基本异常处理 下篇帖子: Oracle中对sequence的操作
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表