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;
分享到:
相关推荐
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`子句找出...
这种方法通过创建两个临时表来辅助删除重复记录的过程。首先,通过`GROUP BY`和`COUNT(*)`函数找出重复的记录,并将这些记录的ID存储到临时表`temp1`中。接着,将不重复的记录也插入到`temp1`中。之后,创建一个新的...
SQL语句删除重复记录 在数据库管理中,删除重复记录是一个非常重要的...我们可以使用多种方法来删除重复记录,包括使用临时表、游标、存储过程和窗口函数等。每种方法都有其优缺,需要根据实际情况选择合适的方法。
以下是如何使用SQL语句来删除数据表中重复记录的详细步骤。 首先,我们来看一个简单的例子,假设我们有一个名为`Repeat`的数据表,其中存在重复的记录。要删除这些重复的记录,但保留每个唯一组合的最新(最大`id`...
这种方法适用于仅需删除重复记录中的部分行,而保留至少一行的情况。通过比较不同记录的ROWID来确定哪些记录是重复的,并利用子查询找出这些重复记录的最大ROWID,然后将其删除。 **SQL示例代码:** ```sql DELETE...
#### 方法二:创建临时表删除重复记录 这种方法则是通过创建一个临时表来保存唯一记录,然后再用这个临时表覆盖原始表。具体步骤如下: 1. **创建临时表并插入唯一记录**:使用`SELECT DISTINCT`语句创建一个临时...
### 四种SQL语句删除重复记录的方法 在数据库管理中,经常会出现数据冗余的情况,特别是当数据量庞大时,这种现象更为普遍。对于重复记录的处理是维护数据库完整性和提高查询效率的重要手段之一。本文将详细介绍四...
在MySQL数据库中,存储过程是一种预编译的SQL语句集合,可以用于执行复杂的数据库操作,如删除重复记录。在给定的存储过程`DelDuplicateRecord`中,它旨在删除具有相同标题的记录,但仅保留每个标题下最早的一条记录...
以上介绍了多种使用SQL删除重复记录的方法,每种方法都有其适用场景和特点。在选择具体方法时,需要考虑数据库的类型、数据量大小以及性能要求等因素。通过合理选择合适的方法,可以有效提高数据清理的效率和准确性...
在SQL中,删除重复记录是一项常见的数据库管理任务,特别是在数据清洗和整理时。本文将详细介绍四种有效的方法来处理这个问题。 **方法1:使用临时表** 这种方法通过创建临时表temp1来存储重复记录,并最终将不重复...
"sql 万能修改,删除表的存储过程"这个话题涉及到如何创建两个存储过程,一个用于更新表的数据,另一个用于删除表的数据。 首先,我们来看"万能修改"的存储过程,其创建语句如下: ```sql CREATE PROCEDURE up @...
- `rowid`用于唯一标识每条记录,从而能够更准确地删除重复记录。 #### 方法八:处理具有多个重复字段的记录 **SQL语句**: ```sql SELECT DISTINCT * INTO #Tmp FROM tableName; DROP TABLE tableName; SELECT * ...
标题和描述概述的知识点主要集中在SQL语言中处理表内重复数据的方法上,涵盖了查询与删除重复数据的不同场景。下面将详细解析这些知识点: ### 查询表中重复数据 #### 单字段重复数据查询 ```sql SELECT * FROM ...
其次,`sp_Column_Insert.sql` 存储过程用于插入新的记录到分类树中。在无限级分类中,新插入的记录需要指定其父节点。这个过程需要计算新记录的层级路径(如"1-2-3"),并确保所有相关字段的值被正确设置。同时,它...
在SQL中删除重复记录是一个常见的需求,特别是在处理大型数据集时。本文将介绍几种有效的方法,以帮助你在遇到重复记录问题时能有效地清理数据。我们将以Oracle数据库为例,但这些方法在其他SQL数据库系统中也具有...
重复数据的存在不仅会占用额外的存储空间,还可能导致数据统计错误、数据分析偏差等问题,因此,有效地删除表中的重复数据是保持数据质量和提高数据库性能的重要环节。本文将详细解析如何在Oracle中删除表中的重复...
在数据库管理与维护的过程中,经常会遇到表中存在重复记录的问题,这不仅会造成数据冗余、浪费存储空间,还可能导致数据分析结果失真。因此,了解如何有效地删除表中的重复数据是一项重要的技能。下面将详细介绍几种...