⽐较两个表数据完全⼀致的sql 现在需要完成⼀个sql,⽐较两个表数据完全⼀致(两个表结构肯定是⼀致的).
我现在是通过minus功能来完成
如果 两个表 minus的结果等于0,那么证明这两个表完全⼀致
当然之前肯定还做⼀个两个表⾏数的⽐较,⾸先要保证两个表⾏数⼀致的,
感觉这样写出来的东东代码是⽐较少,但是不知效率如何
下⾯是整个存储过程,已经调试通过了
正确的做法是:
1、先判断两个表⾏数是否相同,如果相同的继续往下⾛。
2、⽤源表 minus ⽬标表,看返回的⾏数是否为0,如果为0则继续往下⾛。
3、⽤⽬标表 minus 源表,看返回的⾏数是否为零,如果为零则证明两个表相同。
create or replace procedure compareTableData(srcTable in
varchar2 , destTable in varchar2 , oi_return out int)
is
--源表格
src_table  varchar2(32);
--⽬标表格
dest_Table  varchar2(32);
--源表格⾏数
src_table_count int;
--⽬标表格函数
dest_table_count int;
--两个表格数据(即结果集)之间的差集的个数
minus_count int;
selectSrcSql varchar2(100);
selectDestSql varchar2(100);
selectSrcMinusDestSql varchar2(200);
selectDestMinusSrcSql varchar2(200);
--错误描述
v_err_desc varchar2(100);
begin
oi_return  :=0;
dbms_output.put_line(oi_return);
src_table := srcTable;
dest_Table := destTable;
--构建查询源表⾏数的动态sql
selectSrcSql:=' select count(*)  from '||src_table;
DBMS_OUTPUT.PUT_LINE(selectSrcSql);
--执⾏查询源表⾏数的动态sql
execute immediate selectSrcSql Into src_table_count;
--构建查询源⽬标⾏数的动态sql
selectDestSql:=' select count(*)  from ' ||dest_Table;
DBMS_OUTPUT.PUT_LINE(selectDestSql);
--执⾏查询源⽬标⾏数的动态sql
execute immediate selectDestSql Into dest_table_count;
-
-构建查询源表和⽬标表差集⾏数的动态sql
selectSrcMinusDestSql:='select count(*)  from (
selectSrcMinusDestSql:='select count(*)  from (
select * from ' ||src_table||
' minus
select * from ' ||dest_table||  ')';
DBMS_OUTPUT.PUT_LINE(selectSrcMinusDestSql);
--构建查询⽬标表和源表差集⾏数的动态sql
selectDestMinusSrcSql:='select count(*)  from (
select * from ' ||dest_table||
' minus
select * from ' ||src_table||  ')';
DBMS_OUTPUT.PUT_LINE(selectDestMinusSrcSql);
--如果表格⾏数不⼀致,那么证明两个表结果集肯定不⼀致
if(src_table_count!=dest_table_count)
then
oi_return:= src_table_count-dest_table_count;
else
--执⾏查询源表和⽬标表差集⾏数的动态sql
execute immediate selectSrcMinusDestSql into minus_count;
--如果差集为0,表明源表集合中元素在⽬标表中都存在,但是并不能说明源表和⽬标表集合完全⼀致,        --因为源表中可能有重复元素,导致差集也为0的结果
if(minus_count=0)
then
--执⾏查询⽬标表和源表差集⾏数的动态sql
execute immediate selectDestMinusSrcSql into minus_count;
end if;
--返回差集个数,如果是0,那么证明两个表结果集肯定⼀致 ,反之不⼀致
oi_return := minus_count;两张表格查重复数据
end if;
EXCEPTION
WHEN OTHERS THEN
v_err_desc := 'Error' || TO_CHAR(SQLCODE) || ':' || SQLERRM;
oi_return:= SQLCODE;
DBMS_OUTPUT.PUT_LINE(v_err_desc);
end compareTableData;