`

Oracle数据库表结构分析程序

    博客分类:
  • J2SE
阅读更多
java 代码
  1. /*******************************************************************************  
  2.  * @author danlley  
  3.  * @version 1.06.06.12  
  4.  * @since 2006-06-12  
  5.  * <p>Description: 此类用于分析客户库之间,或者开发库与客户库之间出现的不一致问题!  
  6.  *                 要比较两个库中的数据之间差异,只需对常量:DATABASE_A  
  7.  *                                                     DATABASE_B  
  8.  *                 修改成所需批对的数据库即可。  
  9.  *           注意:  在整个处理过程中,表和视图完全按照同一概念处理.</p>  
  10.  *******************************************************************************/  
  11.   
  12. import java.util.Collection;   
  13. import java.util.ArrayList;   
  14. import java.util.Iterator;   
  15. import java.sql.Connection;   
  16. import java.sql.PreparedStatement;   
  17. import java.sql.ResultSet;   
  18. import org.danlley.ora.DBConnection;//用于没有通过上下文进行连接数据库(属于简单连接方式)   
  19. public class CompareCertainDB{   
  20.     /**  
  21.      * 定义两个要进行比较的数据库名常量,可根据需要进行修改  
  22.      */  
  23.     private static final String DATABASE_A="WLJW";   
  24.     private static final String DATABASE_B="JWGL";   
  25.     Connection conn=null;   
  26.     PreparedStatement ps=null;   
  27.     ResultSet rs=null;   
  28.     /**  
  29.      * 说明:此方法用于比较两个不同库中是否有相同表名,相同字段名的字段中字段大小不一致的情况  
  30.      *      如果有,则返回一个集合类用于保存查询结果.  
  31.      *      其中,每条信息都保存在一个内部类 IntityClass 的属性 T_NAME , C_NAME ,  
  32.      *                                                    C_SIZE , CC_SIZE 中.  
  33.      * @return  
  34.      * @throws java.lang.Exception  
  35.      */  
  36.     public Collection com_comp_len_col_both_DB() throws Exception{   
  37.         try{   
  38.             ArrayList com_comp_len_col=new ArrayList();   
  39.             StringBuffer strSQL=new StringBuffer();   
  40.             strSQL.append("select a.atable_name,a.acolumn_name,a.adata_length,b.bdata_length from ");   
  41.             strSQL.append(" (");   
  42.             strSQL.append("     select table_name atable_name, column_name acolumn_name,data_length adata_length");   
  43.             strSQL.append("      from all_tab_columns where owner='WLJW'");   
  44.             strSQL.append(" )a,");   
  45.             strSQL.append(" (");   
  46.             strSQL.append("     select table_name btable_name, column_name bcolumn_name,data_length bdata_length ");   
  47.             strSQL.append("      from all_tab_columns where owner='JWGL'");   
  48.             strSQL.append(" )b ");   
  49.             strSQL.append("where a.acolumn_name=b.bcolumn_name and ");   
  50.             strSQL.append("      a.atable_name=b.btable_name and");   
  51.             strSQL.append("  a.adata_length<>b.bdata_length");   
  52.             conn=DBConnection.getConn();   
  53.             System.out.println("++++++++++++++++++++++++++++++++++++++++++++++");   
  54.             System.out.println(strSQL.toString());   
  55.             System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++");   
  56.             ps=conn.prepareStatement(strSQL.toString());   
  57.             rs=ps.executeQuery();   
  58.             while(rs.next()){   
  59.                 String T_NAME=null//表名   
  60.                 String C_NAME=null//字段名称   
  61.                 String C_SIZE=null//字段大小   
  62.                 String CC_SIZE=null//被比对字段大小   
  63.                 T_NAME=rs.getString("atable_name");   
  64.                 C_NAME=rs.getString("acolumn_name");   
  65.                 C_SIZE=rs.getString("adata_length");   
  66.                 CC_SIZE=rs.getString("bdata_length");   
  67.                 IntityClass intityClass=new IntityClass(T_NAME,C_NAME,C_SIZE,CC_SIZE);   
  68.                 com_comp_len_col.add(intityClass);   
  69.             }   
  70.             int size=com_comp_len_col.size();   
  71.             com_comp_len_col.add(new IntityClass("大小不一致的字段共有:"+size+"个!",null,null,null));   
  72.             return com_comp_len_col;   
  73.         } catch(Exception e){   
  74.             e.printStackTrace();   
  75.             e.getMessage();   
  76.             throw new Exception(e);   
  77.         } finally{   
  78.             DBConnection.close(rs);   
  79.             DBConnection.close(ps);   
  80.             DBConnection.freeConn(conn);   
  81.         }   
  82.     }   
  83.     /**  
  84.      * 说明:此方法用于比对在两个库同一名称的表中,字段名称在一个库中存在,而在另一个库中不存在的情况  
  85.      * @param type 用来决定两个库的比对方式,此参数由 DATABASE_A 和 DATABASE_B  
  86.      *             来取值.  
  87.      *             如果类型为 DATABASE_A ,则查找 DATABASE_A 库中存在而  
  88.      *             DATABASE_B库中不存在的表.  
  89.      *             如果类型为 DATABASE_B ,则查找 DATABASE_B 库中存在,而 DATABASE_A  
  90.      *             库中不存在的情况.  
  91.      * @return  
  92.      * @throws java.lang.Exception  
  93.      */  
  94.     public Collection compCols_in_one_notin_other(String type) throws Exception{   
  95.         ArrayList diff_cols_li=new ArrayList();   
  96.         try{   
  97.             StringBuffer strSQL=new StringBuffer();   
  98.             String typeA="";   
  99.             String typeB="";   
  100.             /********************************************  
  101.              ******            决定查询方式         *******  
  102.              ********************************************/  
  103.             if(CompareCertainDB.DATABASE_A.equals(type)){   
  104.                 typeA=CompareCertainDB.DATABASE_A;   
  105.                 typeB=CompareCertainDB.DATABASE_B;   
  106.             }   
  107.             if(CompareCertainDB.DATABASE_B.equals(type)){   
  108.                 typeB=CompareCertainDB.DATABASE_A;   
  109.                 typeA=CompareCertainDB.DATABASE_B;   
  110.             }   
  111.             strSQL.append("select table_name,column_name,data_type from ");   
  112.             strSQL.append("    (");   
  113.             strSQL.append("        select table_name,column_name,data_type from ");   
  114.             strSQL.append("  (");   
  115.             strSQL.append("      select table_name,column_name,data_type from all_tab_columns where owner='"+typeA+"'");   
  116.             strSQL.append("  )");   
  117.             strSQL.append("        where table_name in (select distinct(table_name) btablename from all_tab_columns where owner ='"+typeB+"')");   
  118.             strSQL.append("    )B ");   
  119.             strSQL.append(" where B.column_name not in (select column_name from all_tab_columns where owner ='"+typeB+"')");   
  120.             conn=DBConnection.getConn();   
  121.             System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");   
  122.             System.out.println(strSQL.toString());   
  123.             System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++");   
  124.             ps=conn.prepareStatement(strSQL.toString());   
  125.             rs=ps.executeQuery();   
  126.             String diff_cols=null;   
  127.             while(rs.next()){   
  128.                 String T_NAME=null;   
  129.                 String C_NAME=null;   
  130.                 String C_TYPE=null;   
  131.                 T_NAME=rs.getString("table_name");   
  132.                 C_NAME=rs.getString("column_name");   
  133.                 C_TYPE=rs.getString("data_type");   
  134.                 IntityClass intityClass=new IntityClass(T_NAME,C_NAME,C_TYPE);   
  135.                 diff_cols_li.add(intityClass);   
  136.             }   
  137.             int size=diff_cols_li.size();   
  138.             diff_cols_li.add(new IntityClass(null,"共有 "+size+" 个字段",null)); //);   
  139.             return diff_cols_li;   
  140.         } catch(Exception e){   
  141.             e.printStackTrace();   
  142.             e.getMessage();   
  143.             throw new Exception(e);   
  144.         } finally{   
  145.             DBConnection.close(rs);   
  146.             DBConnection.close(ps);   
  147.             DBConnection.freeConn(conn);   
  148.         }   
  149.     }   
  150.     /**  
  151.      * <p>Title: 内部类</p>  
  152.      * <p>Description:由于在处理过程中将会大量用到字段名称和字段类型,此处如果新建一个类  
  153.      *                去处理由于仅仅包含五个对象属性,因此有些得补偿失,所以采用内部类,  
  154.      *                这样:  
  155.      *                    首先省去了建一个新的class  
  156.      *                    解决了代码重复定义和使用的臃肿现象  
  157.      *                此内部类中包含五个对象属性:  
  158.      *                     T_NAME    表名  
  159.      *                     C_NAME    字段名称  
  160.      *                     C_TYPE    字段类型  
  161.      *                     C_SIZE    字段大小  
  162.      *                     CC_SIZE   被比对字段大小</p>  
  163.      * @author danlley  
  164.      * @version 1.0  
  165.      */  
  166.     public static class IntityClass{   
  167.         /**  
  168.          * 以下三个属性主要用于用于比对字段类型,同时,除C_TYPE外,其余两属性还将用于  
  169.          * 比对字段大小  
  170.          */  
  171.         String T_NAME=null//表名   
  172.         String C_NAME=null//字段名称   
  173.         String C_TYPE=null//字段类型   
  174.         /**  
  175.          * 下面3个字段与T_NAME,C_NAME一起用于比对字段大小  
  176.          */  
  177.         String C_SIZE=null//字段大小   
  178.         String CC_SIZE=null//被比对字段大小   
  179.         /**  
  180.          * 说明: 此方法用于比对字段类型  
  181.          * @param T_NAME    表名  
  182.          * @param C_NAME    字段名称  
  183.          * @param C_TYPE    字段类型  
  184.          */  
  185.         public IntityClass(String T_NAME,String C_NAME,String C_TYPE){   
  186.             this.T_NAME=T_NAME;   
  187.             this.C_NAME=C_NAME;   
  188.             this.C_TYPE=C_TYPE;   
  189.         }   
  190.         /**  
  191.          * 说明:此方法用于比对字段大小  
  192.          * @param T_NAME    表名  
  193.          * @param C_NAME    字段名称  
  194.          * @param C_SIZE    字段大小  
  195.          * @param CC_SIZE   被比对字段大小  
  196.          */  
  197.         public IntityClass(String T_NAME,String C_NAME,String C_SIZE,String CC_SIZE){   
  198.             this.T_NAME=T_NAME;   
  199.             this.C_NAME=C_NAME;   
  200.             this.C_SIZE=C_SIZE;   
  201.             this.CC_SIZE=CC_SIZE;   
  202.         }   
  203.     }   
  204.     /**  
  205.      * 说明:此方法用于比较并返回两个库中属于一个库,但又不属于另一个库的表信息  
  206.      * @param type 如果传入的参数为“DATABASE_A”,则找出WLJW中存在,但JWGL中不存在的表。  
  207.      *             如果传入的参数为“DATABASE_B”,则找出JWGL中存在,但WLJW中不存在的表。  
  208.      * @return  
  209.      * @throws java.lang.Exception  
  210.      */  
  211.     public Collection tabShldDel(String type) throws Exception{   
  212.         try{   
  213.             ArrayList dutyTabLi=new ArrayList();   
  214.             StringBuffer strSQL=new StringBuffer();   
  215.             String typeA="";   
  216.             String typeB="";   
  217.             /********************************************  
  218.              ******            决定查询方式         *******  
  219.              ********************************************/  
  220.             if(CompareCertainDB.DATABASE_A.equals(type)){   
  221.                 typeA=CompareCertainDB.DATABASE_A;   
  222.                 typeB=CompareCertainDB.DATABASE_B;   
  223.             }   
  224.             if(CompareCertainDB.DATABASE_B.equals(type)){   
  225.                 typeB=CompareCertainDB.DATABASE_A;   
  226.                 typeA=CompareCertainDB.DATABASE_B;   
  227.             }   
  228.             strSQL.append("select atablename from ");   
  229.             strSQL.append("    (");   
  230.             strSQL.append("        select distinct(table_name) atablename from all_tab_columns where owner like '%"+typeA+"%'");   
  231.             strSQL.append("    )A ");   
  232.             strSQL.append(" where A.atablename not in ( ");   
  233.             strSQL.append("select distinct(table_name) btablename from all_tab_columns where owner ='"+typeB+"'");   
  234.             strSQL.append(" ) ");   
  235.             conn=DBConnection.getConn();   
  236.             System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");   
  237.             System.out.println(strSQL.toString());   
  238.             System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++");   
  239.             ps=conn.prepareStatement(strSQL.toString());   
  240.             rs=ps.executeQuery();   
  241.             while(rs.next()){   
  242.                 String tableName=rs.getString("atablename");   
  243.                 dutyTabLi.add(tableName);   
  244.             }   
  245.             int size=dutyTabLi.size();   
  246.             dutyTabLi.add("共有 "+size+" 张表");   
  247.             return dutyTabLi;   
  248.         } catch(Exception e){   
  249.             e.printStackTrace();   
  250.             e.getMessage();   
  251.             throw new Exception(e);   
  252.         } finally{   
  253.             DBConnection.close(rs);   
  254.             DBConnection.close(ps);   
  255.             DBConnection.freeConn(conn);   
  256.         }   
  257.     }   
  258.     /**  
  259.      * 说明:用于返回两个库中的交集表信息  
  260.      * @return  
  261.      * @throws java.lang.Exception  
  262.      */  
  263.     public Collection commonTabLi() throws Exception{   
  264.         try{   
  265.             ArrayList comTabLi=new ArrayList();   
  266.             StringBuffer strSQL=new StringBuffer();   
  267.             strSQL.append("select atablename from ");   
  268.             strSQL.append("    ( ");   
  269.             strSQL.append("        select distinct(table_name) atablename from all_tab_columns where owner='"+CompareCertainDB.DATABASE_A+"'");   
  270.             strSQL.append("    )A ");   
  271.             strSQL.append("where A.atablename in (select distinct(table_name) btablename from all_tab_columns where owner ='"+   
  272.                           CompareCertainDB.DATABASE_B+"')");   
  273.             conn=DBConnection.getConn();   
  274.             System.out.println("+++++++++++++++++++++++++++++++++++++++");   
  275.             System.out.println(strSQL.toString());   
  276.             System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");   
  277.             ps=conn.prepareStatement(strSQL.toString());   
  278.             rs=ps.executeQuery();   
  279.             String comTab=null;   
  280.             while(rs.next()){   
  281.                 comTab=rs.getString("atablename");   
  282.                 comTabLi.add(comTab);   
  283.             }   
  284.             int size=comTabLi.size();   
  285.             comTabLi.add("共有 "+size+" 张表");   
  286.             return comTabLi;   
  287.         } catch(Exception e){   
  288.             e.printStackTrace();   
  289.             e.getMessage();   
  290.             throw new Exception(e);   
  291.         } finally{   
  292.             DBConnection.close(rs);   
  293.             DBConnection.close(ps);   
  294.             DBConnection.freeConn(conn);   
  295.         }   
  296.     }   
  297.     /**  
  298.      * 说明:程序处理入口  
  299.      * @param args  
  300.      */  
  301.     public static void main(String[] args){   
  302.         try{   
  303.             CompareCertainDB compCertDB=new CompareCertainDB();   
  304.             System.out.println("==================================================");   
  305.             System.out.println("          以下为"+CompareCertainDB.DATABASE_A+"中存在但在"+CompareCertainDB.DATABASE_B+"中不存在的表        ");   
  306.             System.out.println("==================================================");   
  307.             Collection inWLJWnotJWGL=compCertDB.tabShldDel(CompareCertainDB.DATABASE_A);   
  308.             Iterator iter_wljw=inWLJWnotJWGL.iterator();   
  309.             String tabinWLJW=null;   
  310.             while(iter_wljw.hasNext()){   
  311.                 tabinWLJW=(String)iter_wljw.next();   
  312.                 System.out.println(""+tabinWLJW);   
  313.             }   
  314.             System.out.println("==================================================\n\n\n\n");   
  315.             System.out.println("==================================================");   
  316.             System.out.println("          以下为"+CompareCertainDB.DATABASE_B+"中存在但在"+CompareCertainDB.DATABASE_A+"中不存在的表        ");   
  317.             System.out.println("==================================================");   
  318.             Collection inJWGLnotWLJW=compCertDB.tabShldDel(CompareCertainDB.DATABASE_B);   
  319.             Iterator iter_jwgl=inJWGLnotWLJW.iterator();   
  320.             String tabinJWGL=null;   
  321.             while(iter_jwgl.hasNext()){   
  322.                 tabinJWGL=(String)iter_jwgl.next();   
  323.                 System.out.println(""+tabinJWGL);   
  324.             }   
  325.             System.out.println("==================================================\n\n\n\n");   
  326.             System.out.println("==================================================");   
  327.             System.out.println("          以下为"+CompareCertainDB.DATABASE_A+"中存在且在"+CompareCertainDB.DATABASE_B+"中也存
分享到:
评论

相关推荐

    Oracle数据库表结构导出成Word文档工具(带源码下载)

    Oracle数据库表结构导出成Word文档工具(带源码下载) 修改了一下数据库的连接方式:由于我安装的是win764位+office64+oracle client 32位,用MSDAORA.1无法连接,所以将MSDAORA.1换为OraOleDb.Oracle.1,换后正常连接...

    DB2,Oracle数据库表结构比较工具[V1.0]

    2.由于数据库的限制(例如DB2约束的列不能修改类型,列长度在存在数据的情况下只能改大,等等),生成的脚本仅供参考; 3.尽管经过简单测试,但生成的脚本仍可能有误,或者程序架构、设计难免存在缺陷欢迎提出宝贵...

    Oracle数据库管理员技术指南

    1.6.1 利用 Oracle 安装程序创建数据库 1.6.2 使用安装程序创建数据库的注意 事项 1.6.3 怎样建立自己的定制数据库创建 脚本 1.6.4 如何从已有数据库克隆数据库 1.6.5 怎样利用 Database Configuration ...

    oracle基础教程

    第1章 ORACLE数据库概述 2 1.1 产品概述 2 1.1.1 产品简介 2 1.1.2 基本概念 3 1.2 ORACLE系统结构 4 1.2.2 ORACLE物理结构 4 1.2.3 系统全局区 6 1.2.4 进程 8 1.3 存储管理 9 1.3.2 逻辑结构 10 1.3.3 表(Table)...

    oracle数据库管理系统v3.5

    可以把ORACLE数据库数据导出生成DMP文件,可以把DMP文件导入到ORACLE数据库中,可以把DMP文件打包上传到FTP服务器指定位置,可以把FTP服务器上指定位置的DMP文件下载到本机指定目录,可以查询ORACLE数据库表记录信息...

    oracle数据库工具

    winform程序,动态配置oracle数据库链接,支持表结构导出,表数据导出。适合做各类系统数据导出工具。

    数据库结构文档生成工具

    1. 本程序基于VS2010+.NET4.0框架开发,开发语言C#。...2. 软件主要功能是根据现有数据库,逆向导出Excel格式的表结构说明文档。 3. 支持MSSQL、Oracle、Mysql。 本人应届生,编程新手,欢迎指导和教育。

    从一个“普通”的Oracle DBA(Oracle数据库管理员)转变为Oracle Applications DBA(Oracle应用程序数据库管理员)

    从一个“普通”的Oracle DBA(Oracle数据库管理员)转变为Oracle Applications DBA(Oracle应用程序数据库管理员),有两个内容你必须去弄清楚。第一个内容是如何成为一个Oracle Applications DBA(Oracle应用程序...

    轻松学Oracle数据库

    轻松学编程:轻松学Oracle数据库》共15章,由浅入深、全面系统地介绍了OracleDatabase11g数据库系统的使用方法和基本管理,其主要内容包括:Oracle11g关系数据库,Oracle数据库的体系结构,SQL*Plus,表空间,管理...

    oracle数据库基础知识(数据库程序设计)

    ,就是如何去管理ORACLE数据库,当然不是管理全部的ORACLE。在此过程 中你将对SQL和ORACLE体系结构有个更深入的了解。 4、到了这一步你基本上算是初步掌握了ORACLE,下面将要根据你的方向来具 体学习其它的ORACLE...

    如何对Oracle数据库系统性能进行优化.doc

    本文主要介绍Oracle系统性能优化的基本方法,并从操作系统、数据库结构规划、数据表设计、数据库参数调整、应用程序SQL语句分析及设计等几个方面给出具体的优化策略,供技术人员在Oracle系统管理和开发应用中参考。

    Oracle数据库实验操作

    第三部分数据库的体系结构 88 实例的维护 88 实验43:数据库的最高帐号sys的操作系统认证模式 90 实验44:数据库的最高帐号sys的密码文件认证模式 92 实验45:数据库的两种初始化参数文件 92 实验46:启动数据库的三...

    Oracle 10g数据库管理、应用与开发标准教程

    主要内容包括:Oracle关系数据库,Oracle数据库体系结构,SQL基本查询,修改SQL数据与SQL*Plus命令,PL/SQL编程基础,用户、模式和表,高级查询,过程、函数和程序包,表类型,索引,视图、序列和同义词,触发器,...

    Oracle数据库SQL基本应用与介绍

    Oracle是能够安装在目前为止所有的计算机上并进行驱动运行的关系型数据库管理系统。Oracle数据库内部的数据操作...Oracle数据库对象:cluster、数据库联接、触发器、外部程序库、索引、Java类、演算子、表、视图等等

    基于JDBC同步Oracle到MySQL

    分别有:数据源配置、数据表结构转换、字段更新、数据迁移、根据oracle SQL的UPDATE DELETE 事物执行记录转为Mysql可执行SQL,同步执行到MySql数据库,此项目为个人兴趣爱好练手项目,项目问题欢迎留言,共同进步...

    jfsky.com-Oracle数据库基础知识

    第1章 ORACLE数据库概述 2 1.1 产品概述 2 1.1.1 产品简介 2 1.1.2 基本概念 3 1.2 ORACLE系统结构 4 1.2.2 ORACLE物理结构 4 1.2.3 系统全局区 6 1.2.4 进程 8 1.3 存储管理 9 1.3.2 逻辑结构 10 1.3.3 表(Table)...

    构建最高可用Oracle数据库系统 Oracle 11gR2 RAC管理、维护与性能优化

    14.3.5安全应用程序角色 14.3.6多规则认证例子 14.4本章小结 第15章 RAC稳定性与性能优化 15.1服务器硬件 15.1.1 Firmware固件升级 15.1.2硬件设备兼容性 15.1.3 FC HBA卡冗余 15.1.4 Infiniband技术 ...

    oracle 数据库学习 基本结构介绍

    * 数据库由数据文件(包含oracle 数据、索引、表结构等数据)、控制文件(包括每个表的操作信息)、日志文件(数据操作sql语句)、参数文件、口令文件、日志归档文件(归档模式下)(服务器崩溃、硬盘损坏情况下,...

Global site tag (gtag.js) - Google Analytics