ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle 去掉重复的数据

oracle 去掉重复的数据

原创 Linux操作系统 作者:Ilovesports 时间:2011-02-21 08:58:35 0 删除 编辑

一道面试题,要求写成存储过程且使用游标,当时胡乱写了一个,编程依赖GUI环境,很多单词拼写错误,巨汗!回来后整理一个!

 

CREATE OR REPLACE PROCEDURE DELETE_REPEAT

/*****************************************************

  FUNCTION : 删除表Hero_repeat表中c_code,c_name重复的且剩一条  

  AUTHOR   : Hero  QQ:305334565

  TOOL     : PL/SQL Developer 7.1.5.1398

  DATE     : 02/14/2011

  MODIFIED  (MM/DD/YYYY)   NOTE

 

  *******************************************************/

(OUT_MSG OUT NUMBER) --返回 0成功,-1失败

 

 IS

  -- define cursor

  CURSOR CUR_DELETE_REP IS

    SELECT C_CODE, C_NAME, MIN(ROWID) RN

      FROM HERO_REPEAT HR

     GROUP BY HR.C_CODE, HR.C_NAME

    HAVING COUNT(*) > 1;

 

  R CUR_DELETE_REP%ROWTYPE;

 

BEGIN

  --方法一:根据游标取出重复的值,删除除了rowid最小的重复数据

  --open cursor

  OPEN CUR_DELETE_REP;

  LOOP

    FETCH CUR_DELETE_REP

      INTO R;

 

    DELETE FROM HERO_REPEAT HR

     WHERE ROWID <> R.RN

       AND HR.C_CODE = R.C_CODE

       AND HR.C_NAME = R.C_NAME;

 

    EXIT WHEN CUR_DELETE_REP%NOTFOUND;

  END LOOP;

  CLOSE CUR_DELETE_REP;

 

  --方法二:使用for loop删除

 

  /*  FOR X IN (SELECT C_CODE, C_NAME, MIN(ROWID) RN

                FROM HERO_REPEAT HR

               GROUP BY HR.C_CODE, HR.C_NAME

              HAVING COUNT(*) > 1) LOOP

   

      DELETE FROM HERO_REPEAT HR

       WHERE ROWID <> X.RN

         AND HR.C_CODE = X.C_CODE

         AND HR.C_NAME = X.C_NAME;

        

    END LOOP;

  */

  OUT_MSG := 0; --成功

 

EXCEPTION

  WHEN OTHERS THEN

 

    OUT_MSG := -1; --失败

    --记录异常信息

    --PRC_ERROR_LOG('DELETE_REPEAT', '出现了未知的错误'); 

    RETURN;

END;

 

  /*

  --create test data; 

  DROP TABLE HERO_REPEAT;

  CREATE TABLE hero_repeat AS

  SELECT '01' C_CODE, 'abc' C_NAME

    FROM DUAL

  UNION ALL

  SELECT '01' C_CODE, 'abc' C_NAME

    FROM DUAL

  UNION ALL

  SELECT '01' C_CODE, 'abc' C_NAME

    FROM DUAL

  UNION ALL

  SELECT '01' C_CODE, 'abc' C_NAME

    FROM DUAL

  UNION ALL

  SELECT '02' C_CODE, 'efg' C_NAME

    FROM DUAL

  UNION ALL

  SELECT '02' C_CODE, 'efg' C_NAME

    FROM DUAL

  UNION ALL

  SELECT '02' C_CODE, 'efg' C_NAME

    FROM DUAL

  UNION ALL

  SELECT '02' C_CODE, 'fg' C_NAME

    FROM DUAL

  UNION ALL

  SELECT '03' C_CODE, 'abc' C_NAME

    FROM DUAL

  UNION ALL

  SELECT '03' C_CODE, 'abc' C_NAME

    FROM DUAL

  UNION ALL

  SELECT '03' C_CODE, 'hjk' C_NAME

    FROM DUAL

  UNION ALL

  SELECT '03' C_CODE, 'hjk' C_NAME FROM DUAL;

 

  */

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21980288/viewspace-687592/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2010-07-28

  • 博文量
    1
  • 访问量
    1710