oracle 比较两个用户表结构的区别。

 

 

create table ESPACE_TABLE

(

  TABLE_NAME VARCHAR2(100) not null

)

 

create table ESPACE_COLUMN

(

  TABLE_NAME  VARCHAR2(100) not null,

  COLUMN_NAME VARCHAR2(100) not null

)

 

create table UC_TABLE_DIFFERENT

(

  S_TABLE_NAME     VARCHAR2(30),

  B_TABLE_NAME     VARCHAR2(30),

  S_COLUMN_NAME    VARCHAR2(30),

  B_COLUMN_NAME    VARCHAR2(30),

  S_DATA_TYPE      VARCHAR2(106),

  B_DATA_TYPE      VARCHAR2(106),

  S_DATA_LENGTH    NUMBER,

  B_DATA_LENGTH    NUMBER,

  S_DATA_PRECISION NUMBER,

  B_DATA_PRECISION NUMBER,

  S_DATA_SCALE     NUMBER,

  B_DATA_SCALE     NUMBER,

  S_NULLABLE       VARCHAR2(1),

  B_NULLABLE       VARCHAR2(1),

  S_DATA_DEFAULT   VARCHAR2(4000),

  B_DATA_DEFAULT   VARCHAR2(4000)

)

 

create table SDU_TABLES

(

  TABLE_NAME     VARCHAR2(30) not null,

  COLUMN_NAME    VARCHAR2(30) not null,

  DATA_TYPE      VARCHAR2(106),

  DATA_LENGTH    NUMBER not null,

  DATA_PRECISION NUMBER,

  DATA_SCALE     NUMBER,

  NULLABLE       VARCHAR2(1),

  DATA_DEFAULT   VARCHAR2(4000)

)

 

create table UC_TABLE_DIFFERENT

(

  S_TABLE_NAME     VARCHAR2(30),

  B_TABLE_NAME     VARCHAR2(30),

  S_COLUMN_NAME    VARCHAR2(30),

  B_COLUMN_NAME    VARCHAR2(30),

  S_DATA_TYPE      VARCHAR2(106),

  B_DATA_TYPE      VARCHAR2(106),

  S_DATA_LENGTH    NUMBER,

  B_DATA_LENGTH    NUMBER,

  S_DATA_PRECISION NUMBER,

  B_DATA_PRECISION NUMBER,

  S_DATA_SCALE     NUMBER,

  B_DATA_SCALE     NUMBER,

  S_NULLABLE       VARCHAR2(1),

  B_NULLABLE       VARCHAR2(1),

  S_DATA_DEFAULT   VARCHAR2(4000),

  B_DATA_DEFAULT   VARCHAR2(4000)

)

 

 

CREATE OR REPLACE PROCEDURE COMPARE_UC_TABLES

AS

BEGIN



    execute immediate 'delete from sdu_tables';

    execute immediate 'delete from bmp_tables';

    execute immediate 'delete from uc_table_different';



    execute immediate 'insert into sdu_tables select

          A.Table_Name,

          A.column_name ,A.data_type ,A.data_length ,A.data_precision ,

          A.Data_Scale ,A.nullable ,Default_value(a.OWNER,a.Table_Name,a.column_name) as Data_default

      from

          dba_tab_columns A

      where

          A.owner=''SDU'' and SUBSTR(TABLE_NAME,1,4) != ''BIN$''';

    execute immediate 'insert into bmp_tables select

          A.Table_Name,

          A.column_name ,A.data_type ,A.data_length ,A.data_precision ,

          A.Data_Scale ,A.nullable ,Default_value(a.OWNER,a.Table_Name,a.column_name) as Data_default

      from

          dba_tab_columns A

       where

          A.owner=''BMP'' and SUBSTR(TABLE_NAME,1,4) != ''BIN$''';



    DELETE FROM sdu_tables WHERE TABLE_NAME IN (SELECT TABLE_NAME FROM ESPACE_TABLE);

    DELETE FROM bmp_tables WHERE TABLE_NAME IN (SELECT TABLE_NAME FROM ESPACE_TABLE);

    DELETE FROM sdu_tables S WHERE EXISTS (SELECT 1 FROM ESPACE_COLUMN E WHERE E.TABLE_NAME = S.TABLE_NAME AND E.COLUMN_NAME = S.COLUMN_NAME);

    DELETE FROM bmp_tables B WHERE EXISTS (SELECT 1 FROM ESPACE_COLUMN E WHERE E.TABLE_NAME = B.TABLE_NAME AND E.COLUMN_NAME = B.COLUMN_NAME);

    commit;



execute immediate 'insert into uc_table_different select *

    from (select s.Table_Name     s_Table_Name,

                 b.Table_Name     b_Table_Name,

                 s.column_name    s_column_name,

                 b.column_name    b_column_name,

                 s.data_type      s_data_type,

                 b.data_type      b_data_type,

                 s.data_length    s_data_length,

                 b.data_length    b_data_length,

                 s.data_precision s_data_precision,

                 b.data_precision b_data_precision,

                 s.Data_Scale     s_Data_Scale,

                 b.Data_Scale     b_Data_Scale,

                 s.nullable       s_nullable,

                 b.nullable       b_nullable,

                 s.Data_default   s_Data_default,

                 b.Data_default   b_Data_default

            from sdu_tables s

            full join bmp_tables b on s.Table_Name = b.Table_Name

                                  and s.column_name = b.column_name)

   where s_column_name is null

      or b_column_name is null

      or s_data_type != b_data_type

      or s_data_length != b_data_length

      or s_data_precision != b_data_precision

      or s_Data_Scale != b_Data_Scale

      or s_nullable != b_nullable

      or s_Data_default != b_Data_default';



commit;



END COMPARE_UC_TABLES;

  

 

begin

  compare_uc_tables;

end;

/

select * from uc_table_different ;

 

你可能感兴趣的:(oracle)