[20131211]对比两个表的不同信息.txt

[20131211]对比两个表的不同信息.txt

昨天看了http://jonathanlewis.wordpress.com/2013/12/09/differences/博客,通过包dbms_rectifier_diff可以查看两个表存在那些不同。

自己做一个测试看看,重复测试。

SCOTT@test> @ver
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

1.建立环境:
create table t1 nologging as
select rownum id, to_char(rownum) small_vc, rpad(rownum,100,'x') padding from all_objects where rownum
alter table t1 add constraint t1_pk primary key (id) nologging;
delete from t1 where id in (22, 300, 850);
update t1 set padding=rpad(rownum,100,'y') where id=1;
--我修改1条记录。

create table t2 nologging as
select rownum id, to_char(rownum) small_vc, rpad(rownum,100,'x') padding from all_objects where rownum
alter table t2 add constraint t2_pk primary key (id) nologging;
delete from t2 where id in (55, 475, 760);
commit;

drop table diff_data purge;
drop table diff_rowids purge;
create table diff_data ( id number, small_vc varchar2(40), padding varchar2(100));
create table diff_rowids( r_id rowid, present varchar2(4000), absent varchar2(4000)) ;

2.对比:
begin
    dbms_rectifier_diff.differences(
    sname1             => user,    -- reference schema
    oname1            => 'T1',    -- reference table
    reference_site         => null,    -- reference site (null => current) db_link
    sname2            => user,    -- target schema
    oname2            => 'T2',    -- target table
    comparison_site        => NULL,    -- target site (null => current) db_link
    where_clause        => 'id
                        -- optional where clause to restrict rows
    column_list        => null,    -- e.g. 'id,padding' , null=> all,
                        -- leave no spaces around commas
    missing_rows_sname    => user,    -- output schema,
    missing_rows_oname1    => 'DIFF_DATA',    -- table to list mismatching data
    missing_rows_oname2    => 'DIFF_ROWIDS',-- table to locate mismatching data
    missing_rows_site    => null,    -- output site (null => current) db_link
    max_missing        => 10,        -- how many differences before stopping
    commit_rows        => 100        -- how many rows to commit in output
    );
end;
/
--我修改了comparison_site=> NULL.

column absent  format a30
column present format a30

SCOTT@test> select * from diff_rowids;

R_ID               PRESENT                        ABSENT
------------------ ------------------------------ ------------------------------
AABEqAAAEAAAAJ8AAA TEST.COM                       TEST.COM
AABEqAAAEAAAAJ8AAB TEST.COM                       TEST.COM
AABEqAAAEAAAAJ8AAC TEST.COM                       TEST.COM
AABEqAAAEAAAAJ8AAD TEST.COM                       TEST.COM
AABEqAAAEAAAAJ8AAE TEST.COM                       TEST.COM
AABEqAAAEAAAAJ8AAF TEST.COM                       TEST.COM
AABEqAAAEAAAAJ8AAG TEST.COM                       TEST.COM
AABEqAAAEAAAAJ8AAH TEST.COM                       TEST.COM

8 rows selected.

column id       format 999
column small_vc format a10
column padding  format a10

SCOTT@test> select rowid, id, small_vc, substr(padding,1,10) padding from diff_data;
ROWID                ID SMALL_VC   PADDING
------------------ ---- ---------- ----------
AABEqAAAEAAAAJ8AAA    1 1          1yyyyyyyyy
AABEqAAAEAAAAJ8AAB   55 55         55xxxxxxxx
AABEqAAAEAAAAJ8AAC  475 475        475xxxxxxx
AABEqAAAEAAAAJ8AAD  760 760        760xxxxxxx
AABEqAAAEAAAAJ8AAE    1 1          1xxxxxxxxx
AABEqAAAEAAAAJ8AAF   22 22         22xxxxxxxx
AABEqAAAEAAAAJ8AAG  300 300        300xxxxxxx
AABEqAAAEAAAAJ8AAH  850 850        850xxxxxxx

8 rows selected.
--可以发现没有或者不同记录记录在diff_data;

3.除去不同的记录:
SCOTT@test> select count(*) from t1;
  COUNT(*)
----------
       997

SCOTT@test> select count(*) from t2;
  COUNT(*)
----------
       997

begin
    dbms_rectifier_diff.RECTIFY(
    sname1             => user,    -- reference schema
    oname1            => 'T1',    -- reference table
    reference_site         => null,    -- reference site (null => current)
    sname2            => user,    -- target schema
    oname2            => 'T2',    -- target table
    comparison_site        => NULL,    -- target site (null => current)
    column_list        => null,    -- e.g. 'id,padding' , null=> all,
                        -- leave no spaces around commas
    missing_rows_sname    => user,    -- output schema,
    missing_rows_oname1    => 'DIFF_DATA',    -- table to list mismatching data
    missing_rows_oname2    => 'DIFF_ROWIDS',-- table to locate mismatching data
    missing_rows_site    => null,    -- output site (null => current)
    commit_rows        => 100        -- how many rows to commit in output
    );    
end;
/
--我修改了comparison_site=> NULL.

SCOTT@test> select * from diff_rowids;
no rows selected

SCOTT@test> select rowid, id, small_vc, substr(padding,1,10) padding from diff_data;
no rows selected

SCOTT@test> select count(*) from t1;
  COUNT(*)
----------
       997

SCOTT@test> select count(*) from t2;
  COUNT(*)
----------
       993

SCOTT@test> select * from t2 where id in (1,22, 300, 850);
no rows selected

--可以发现T2删除了id in (1,22, 300, 850)的记录。

时间: 2024-07-31 01:46:36

[20131211]对比两个表的不同信息.txt的相关文章

信息-mysql中有关两张表关联的查询语句

问题描述 mysql中有关两张表关联的查询语句 宝宝信息表中存的是已经接种过疫苗的信息,is_vaccined为1,另外一张表中,存的是所有疫苗的详细信息.现在,我想通过获取宝宝id来查询该宝宝所有的疫苗的状态(包括已经接种的和未接种的),改怎么写查询语句?? 解决方案 select t1.*, t2.* from t_baby_info t1 left outer join t_vaccine t2 on t1.vaccine_id= t2.vaccine_id 解决方案二: @caozhy

sql-SQL 同步tableA和tableB两张表的信息

问题描述 SQL 同步tableA和tableB两张表的信息 tableA(no,name1,status,time)和tableB(no,name1) no为主键 A表要同步B表的数据,status记录改信息是"新增"或者"修改"或者"删除" time为新增或修改或删除的时间 这个SQL要怎么写 ?求具体的语句啊谢谢! 解决方案 这是我写的一个sql文件,你保存成sql文件可以试试. DELIMITER $$ INSERT INTO table

订单表里添加商品id-怎么在订单表添加商品信息

问题描述 怎么在订单表添加商品信息 一个订单可以有多个商品那么怎么在点单表里添加多个商品的信息或id 解决方案 一般是用两张表,表一主要存订单号等信息,表二存详细的商品信息 解决方案二: 可以再增加一个订单明细表,里面保存订单对应的商品

看实例学VFP:同时向两个表中添加记录

本文利用看实例学VFP:利用多个表中的字段创建新表这个实例中的知识来制作一个文本式录入表单的简单示例,通过这个表单可以同时向"数据1"数据库中的"网站信息表"和"附加信息表"这两个表中添加记录,并且对录入的数据可以选择"保存"."添加"或"撤消".这两个表的索引字段分别是"编号"和"网站编号",这两个字段的内容是完全相同的,只是分别处于两个表中,并

sqlserver-数据库方面的问题,两张表有一个关联表

问题描述 数据库方面的问题,两张表有一个关联表 怎么才能通过关联表的信息找到其他两张表的基本信息呢? 一个是学生的基本信息表(uid,uname...) 一个是课程的基本信息表(tid,tname,ttype) 一个是中间表,使用外键进行连接(id,uid,tid) 现在想通过中间表中的tid找到uname和tname,ttype,一条sql语句不太懂怎么写,谢谢各位啊 解决方案 select * from T_student s inner join T_MID m on s.uid=m.ui

java-当我删除学生表中的信息时,提示该学生在老师表中存在.

问题描述 当我删除学生表中的信息时,提示该学生在老师表中存在. tab_teacher (老师表) t_id t_name t_s_id {001,王老师,100} {002,李老师,101} {003,李老师,102} tab_student (学生表) s_id s_name {100,张三} {104,张四} {100,张三}我删除这条信息的时候,提示该学生老师表中存在.求代码 解决方案 删之前加个判断 .. 1先查询教师表有没有数据(select * from teacher where

hibernate两个表之间的关联关系,主键和外键的类型不同

问题描述 hibernate两个表之间的关联关系,主键和外键的类型不同 现在有两个表,表a和b两个表,a里面的主键为aid,b的主键为bid,b中有a的外键aid,现在aid的类型为int类型的,b表中的aid为string类型的,如何建立关联关系才能够解决当前报错的问题呢?报错信息如下:Wrong column type in b for column aid. Found: varchar expected: integer这个错误的意思是说,在b表中找到了varchar类型的aid,但是我

mysql数据库表里面有一个属性映射到另外两个表的主键,hibernate的配置文件如何写

问题描述 mysql数据库表里面有一个属性映射到另外两个表的主键,hibernate的配置文件如何写 就是说有一个反馈信息的表,里面有一个属性useridOrclubid 是映射到社团表主键clubid 和用户表主键userid 的.我应该怎么样配置hbm.xml文件 解决方案 http://stackoverflow.com/questions/4089539/hibernate-use-two-foreign-keys-for-different-coloumnshttp://stackov

藏在表分区统计信息背后的小秘密

曾令军 云和恩墨技术专家,8年数据库运维经验.思维敏捷,擅长于数据库开发.解决棘手的数据库故障和性能问题,在数据库故障诊断.运维监控.性能优化方面积累了丰富的经验. 本文由一个表分区统计信息没有按预期更新的问题,逐步深入设疑.探因.求实,解开关于表分区统计信息收集的秘密.曲径通幽处,禅房花木深.让我们打开数据库知识的那扇窗,去看到花木浓茂幽静自然的美好. 案例背景 客户的业务系统中,做了AB表设计.A代表日间业务表,只存放一天的交易数据:B代表历史数据表,每天一个分区.每天晚上A表的所有数据会转