`
Zhijie.Geng
  • 浏览: 56499 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自己写的存储过程 sql树 删除表中重复记录

阅读更多
CREATE OR REPLACE PROCEDURE getUserMenuResource(roid IN Varchar2)
AS
BEGIN
  DELETE FROM BOCO_TEMP_MENURESOURCE;
  COMMIT;
  --读出所有角色表所对应的菜单ID
  DECLARE CURSOR records IS SELECT a.funcid FROM boco_rolemenurelation a WHERE a.roleid=roid ORDER BY a.funcid;
  BEGIN
    FOR cur IN records LOOP
        --SELECT a.displayname,a.url,a.pid,a.icon,a.disorder,a.code,a.isshow INTO BOCO_TEMP_MENURESOURCE(displayname,url,pid,icon,disorder,code,isshow) FROM boco_menuresource a START WITH a.CODE =cur.funcid CONNECT BY a.PID = PRIOR a.code  ;
        --Dbms_Output.put_line(cur.funcid);
         Dbms_Output.put_line(cur.funcid );
        --遍历所有根菜单下的所有子菜单项,将其写入 BOCO_TEMP_MENURESOURCE 表
        INSERT INTO  BOCO_TEMP_MENURESOURCE(DISPLAYNAME,
                              URL,
                              PID,
                              ICON,
                              DISORDER,
                              CODE,
                              ISSHOW)
SELECT A.DISPLAYNAME, A.URL, A.PID, A.ICON, A.DISORDER, A.CODE, A.ISSHOW FROM BOCO_MENURESOURCE A START WITH A.CODE =cur.funcid CONNECT BY A.PID = PRIOR A.code  ;
    END
    LOOP;
    EXCEPTION
        WHEN OTHERS THEN
             Dbms_Output.put_line(SQLERRM);
  END;
  --删除表中重复菜单记录项  
  DELETE FROM boco_temp_menuresource
  WHERE code IN (SELECT code FROM 
  boco_temp_menuresource GROUP BY code HAVING COUNT(code)>1)
  AND ROWID NOT IN (SELECT MIN(ROWID) FROM boco_temp_menuresource GROUP BY code HAVING COUNT(code)>1);

  --SELECT * FROM BOCO_TEMP_MENURESOURCE;
  COMMIT;
END;











CREATE OR REPLACE PROCEDURE GETUSERMENURESOURCE(ORGCODE IN VARCHAR2) AS
  V_SQL VARCHAR2(1000); --查询字符串
  V_PID NVARCHAR2(20); --父节点
  TYPE CUR_TYPE IS REF CURSOR;
  CUR_FIELDLIST CUR_TYPE;

  V_FUNCID NVARCHAR2(10); --菜单CODE  

BEGIN

  DBMS_OUTPUT.PUT_LINE('***********执行开始...');
  DBMS_OUTPUT.PUT_LINE('***********orgCode:' || ORGCODE);
  DBMS_OUTPUT.PUT_LINE('************');

  --删除临时表数据
  DELETE FROM T_TYBOOK_BACK_TMP_MENURESOURCE;
  COMMIT;
  --查询PID项,看是否要根节点
  SELECT PID
    INTO V_PID
    FROM T_TYBOOK_BACK_ORGANIZE A
   WHERE A.CODE = ORGCODE;

  IF V_PID IS NULL THEN
    --查询所有菜单 
    V_SQL := 'SELECT code  FROM T_TYBOOK_BACK_MENURESOURCE';
  ELSE
    --规则为二级组织和一级组织拥有同样权限
    SELECT PID
      INTO V_PID
      FROM T_TYBOOK_BACK_ORGANIZE A
     WHERE A.CODE = V_PID;
    IF V_PID IS NULL THEN
      V_SQL := 'SELECT code  FROM T_TYBOOK_BACK_MENURESOURCE';
    ELSE
      --查询包含子菜单在内所有上级组织所对应的菜单
      --v_sql:='SELECT M.FUNCID FROM (SELECT * FROM t_tybook_back_organize a START WITH a.code =''' || orgCode || '''  CONNECT BY PRIOR a.pid = a.code) T    JOIN t_tybook_back_orgmenu M ON T.CODE=M.ORG_CODE' ;
    
      --查询直属菜单
      V_SQL := 'SELECT M.Funcid FROM  (SELECT * FROM T_TYBOOK_BACK_ORGANIZE A  WHERE A.CODE = ''' ||
               ORGCODE || ''' UNION ';
      V_SQL := V_SQL ||
               ' SELECT * FROM T_TYBOOK_BACK_ORGANIZE B  WHERE B.CODE = (SELECT pid FROM T_TYBOOK_BACK_ORGANIZE A  WHERE A.CODE = ''' ||
               ORGCODE ||
               ''')) T INNER JOIN t_tybook_back_orgmenu M ON T.CODE=M.ORG_CODE ';
    
    END IF;
  END IF;

  DBMS_OUTPUT.PUT_LINE('************步骤1:查询直属菜单');
  DBMS_OUTPUT.PUT_LINE('------------' || V_SQL);

  --打开游标 SQL 集合
  OPEN CUR_FIELDLIST FOR V_SQL;
  DBMS_OUTPUT.PUT_LINE('************打开游标成功:cur_fieldlist');
  DBMS_OUTPUT.PUT_LINE('************');
  DBMS_OUTPUT.PUT_LINE('************执行循环遍历');
  DBMS_OUTPUT.PUT_LINE('************步骤2:取出包含当前菜单在内的下级的所有子菜单');
  LOOP
    --遍历游标数据,将每个菜单下的所有子菜单项写时临时表中            
    FETCH CUR_FIELDLIST
      INTO V_FUNCID;
    DBMS_OUTPUT.PUT_LINE('************功能菜单编码:' || V_FUNCID);
  
    EXIT WHEN CUR_FIELDLIST%NOTFOUND;
  
    --在菜单表中以 v_funcid 为根,查找根下面的所有子菜单项,将其写入临时表中
    INSERT INTO T_TYBOOK_BACK_TMP_MENURESOURCE
      (DISPLAYNAME, URL, PID, ICON, DISORDER, CODE, ISSHOW)
      SELECT A.DISPLAYNAME,
             A.URL,
             A.PID,
             A.ICON,
             A.DISORDER,
             A.CODE,
             A.ISSHOW
        FROM T_TYBOOK_BACK_MENURESOURCE A
       START WITH A.CODE = V_FUNCID
      CONNECT BY A.PID = PRIOR A.CODE;
    DBMS_OUTPUT.PUT_LINE('************' ||
                         'INSERT INTO  T_TYBOOK_BACK_TMP_MENURESOURCE(DISPLAYNAME, URL,PID,ICON,DISORDER,CODE,ISSHOW) SELECT A.DISPLAYNAME, A.URL, A.PID, A.ICON, A.DISORDER, A.CODE, A.ISSHOW FROM T_TYBOOK_BACK_MENURESOURCE A START WITH A.CODE =''' ||
                         V_FUNCID || '''  CONNECT BY A.PID = PRIOR A.code');
  END LOOP;

  DBMS_OUTPUT.PUT_LINE('************');
  DBMS_OUTPUT.PUT_LINE('************删除表重复记录');

  --删除表重复记录
  DELETE FROM T_TYBOOK_BACK_TMP_MENURESOURCE
   WHERE CODE IN (SELECT CODE
                    FROM T_TYBOOK_BACK_TMP_MENURESOURCE
                   GROUP BY CODE
                  HAVING COUNT(CODE) > 1)
     AND ROWID NOT IN (SELECT MIN(ROWID)
                         FROM T_TYBOOK_BACK_TMP_MENURESOURCE
                        GROUP BY CODE
                       HAVING COUNT(CODE) > 1);

  DBMS_OUTPUT.PUT_LINE('************');
  DBMS_OUTPUT.PUT_LINE('************继承菜单项:');

  --此表中URL做为特殊处理字段,如果为非 orgCode 下所拥有的菜单,则 "_+URL" 来标识为继承权限, 更新临时表数据URL
  --查询自身菜单所对应的菜单权限
  --DECLARE CURSOR records IS SELECT a.funcid FROM  t_tybook_back_orgmenu a WHERE a.org_code=orgCode; 

  --查询包含子菜单在内所有上级组织所对应的菜单
  DECLARE
    CURSOR RECORDS IS
      SELECT T.CODE
        FROM (SELECT *
                FROM T_TYBOOK_BACK_ORGANIZE A
               START WITH A.CODE = ORGCODE
              CONNECT BY PRIOR A.PID = A.CODE) T;
  BEGIN
    FOR CUR IN RECORDS LOOP
      IF CUR.CODE != ORGCODE THEN
        DBMS_OUTPUT.PUT_LINE('************CODE:' || CUR.CODE);
        --查询所有组织对应的菜单
        DECLARE
          CURSOR RS IS
            SELECT B.FUNCID
              FROM T_TYBOOK_BACK_ORGMENU B
             WHERE B.ORG_CODE = CUR.CODE;
        BEGIN
          FOR R IN RS LOOP
            --更新选择状态
            UPDATE T_TYBOOK_BACK_TMP_MENURESOURCE A
               SET A.DESCRIPTION = '*',A.DISPLAYNAME= CASE WHEN instr(A.Displayname,'上)',1)>0 THEN A.DISPLAYNAME ELSE '(上)'||A.DISPLAYNAME END   
             WHERE A.CODE = R.FUNCID;
 
          END LOOP;
        END;
      
      END IF;
    
    END LOOP;
  END;

  --更新orgCode所对应的菜单权限 
  DECLARE
    CURSOR RES IS
      SELECT B.FUNCID
        FROM T_TYBOOK_BACK_ORGMENU B
       WHERE B.ORG_CODE = ORGCODE;
  BEGIN
    FOR RE IN RES LOOP
      UPDATE T_TYBOOK_BACK_TMP_MENURESOURCE A
         SET A.DESCRIPTION = '_'
       WHERE A.CODE = RE.FUNCID;
    END LOOP;
  END;

  DBMS_OUTPUT.PUT_LINE('************');
  DBMS_OUTPUT.PUT_LINE('***********执行结束...');
  CLOSE CUR_FIELDLIST;
  COMMIT;

END;

分享到:
评论

相关推荐

    删除表中重复数据sql语句

    2. **删除表中多余的重复记录** - **删除单字段重复记录(保留最小ROWID)** ```sql DELETE FROM people WHERE peopleId IN ( SELECT peopleId FROM people GROUP BY peopleId HAVING COUNT(peopleId) > 1 ...

    删除数据表中重复记录

    #### SQL删除重复记录的基本思路 删除重复记录的核心思想是先识别出哪些记录是重复的,然后通过某种方式将这些重复记录从数据表中移除。通常的做法包括: 1. **识别重复记录**:通过`GROUP BY`和`HAVING`子句找出...

    sql删除表中重复记录方法

    这种方法通过创建两个临时表来辅助删除重复记录的过程。首先,通过`GROUP BY`和`COUNT(*)`函数找出重复的记录,并将这些记录的ID存储到临时表`temp1`中。接着,将不重复的记录也插入到`temp1`中。之后,创建一个新的...

    SQL语句删除重复记录

    SQL语句删除重复记录 在数据库管理中,删除重复记录是一个非常重要的...我们可以使用多种方法来删除重复记录,包括使用临时表、游标、存储过程和窗口函数等。每种方法都有其优缺,需要根据实际情况选择合适的方法。

    SQL语句删除数据表中重复的记录

    以下是如何使用SQL语句来删除数据表中重复记录的详细步骤。 首先,我们来看一个简单的例子,假设我们有一个名为`Repeat`的数据表,其中存在重复的记录。要删除这些重复的记录,但保留每个唯一组合的最新(最大`id`...

    Oracle数据库删除表中重复记录的方法三则.txt

    这种方法适用于仅需删除重复记录中的部分行,而保留至少一行的情况。通过比较不同记录的ROWID来确定哪些记录是重复的,并利用子查询找出这些重复记录的最大ROWID,然后将其删除。 **SQL示例代码:** ```sql DELETE...

    SQL删除表里的重复数据的两种方法

    #### 方法二:创建临时表删除重复记录 这种方法则是通过创建一个临时表来保存唯一记录,然后再用这个临时表覆盖原始表。具体步骤如下: 1. **创建临时表并插入唯一记录**:使用`SELECT DISTINCT`语句创建一个临时...

    四种SQL语句删除重复记录的方法

    ### 四种SQL语句删除重复记录的方法 在数据库管理中,经常会出现数据冗余的情况,特别是当数据量庞大时,这种现象更为普遍。对于重复记录的处理是维护数据库完整性和提高查询效率的重要手段之一。本文将详细介绍四...

    通过存储过程删除Mysql数据库表中的重复记录.pdf

    在MySQL数据库中,存储过程是一种预编译的SQL语句集合,可以用于执行复杂的数据库操作,如删除重复记录。在给定的存储过程`DelDuplicateRecord`中,它旨在删除具有相同标题的记录,但仅保留每个标题下最早的一条记录...

    用SQL删除重复记录的N种方法

    以上介绍了多种使用SQL删除重复记录的方法,每种方法都有其适用场景和特点。在选择具体方法时,需要考虑数据库的类型、数据量大小以及性能要求等因素。通过合理选择合适的方法,可以有效提高数据清理的效率和准确性...

    SQL删除重复记录的方法

    在SQL中,删除重复记录是一项常见的数据库管理任务,特别是在数据清洗和整理时。本文将详细介绍四种有效的方法来处理这个问题。 **方法1:使用临时表** 这种方法通过创建临时表temp1来存储重复记录,并最终将不重复...

    sql 万能修改,删除表的存储过程

    "sql 万能修改,删除表的存储过程"这个话题涉及到如何创建两个存储过程,一个用于更新表的数据,另一个用于删除表的数据。 首先,我们来看"万能修改"的存储过程,其创建语句如下: ```sql CREATE PROCEDURE up @...

    sql查询重复记录方法大全

    - `rowid`用于唯一标识每条记录,从而能够更准确地删除重复记录。 #### 方法八:处理具有多个重复字段的记录 **SQL语句**: ```sql SELECT DISTINCT * INTO #Tmp FROM tableName; DROP TABLE tableName; SELECT * ...

    查询和删除表中重复数据sql语句

    标题和描述概述的知识点主要集中在SQL语言中处理表内重复数据的方法上,涵盖了查询与删除重复数据的不同场景。下面将详细解析这些知识点: ### 查询表中重复数据 #### 单字段重复数据查询 ```sql SELECT * FROM ...

    SQL2005动态表无限级分类存储过程

    其次,`sp_Column_Insert.sql` 存储过程用于插入新的记录到分类树中。在无限级分类中,新插入的记录需要指定其父节点。这个过程需要计算新记录的层级路径(如"1-2-3"),并确保所有相关字段的值被正确设置。同时,它...

    在SQL中删除重复记录多种方法

    在SQL中删除重复记录是一个常见的需求,特别是在处理大型数据集时。本文将介绍几种有效的方法,以帮助你在遇到重复记录问题时能有效地清理数据。我们将以Oracle数据库为例,但这些方法在其他SQL数据库系统中也具有...

    Oracle删除表中的重复数据

    重复数据的存在不仅会占用额外的存储空间,还可能导致数据统计错误、数据分析偏差等问题,因此,有效地删除表中的重复数据是保持数据质量和提高数据库性能的重要环节。本文将详细解析如何在Oracle中删除表中的重复...

    如何删除表中重复数据

    在数据库管理与维护的过程中,经常会遇到表中存在重复记录的问题,这不仅会造成数据冗余、浪费存储空间,还可能导致数据分析结果失真。因此,了解如何有效地删除表中的重复数据是一项重要的技能。下面将详细介绍几种...

Global site tag (gtag.js) - Google Analytics