SQL比较两个表数据

Posted on 2009-02-13 22:52  冰菓  阅读(2893)  评论(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 (
         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;

博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3