CREATE OR REPLACE PROCEDURE P_Permission_GetUserPermission
(
P_UserID IN NUMBER
)
AS
RET VARCHAR2(4000);
BEGIN
RET := '';
WITH T AS (
SELECT DISTINCT ActionID FROM RoleAction WHERE EXISTS(SELECT 1 FROM UserRole WHERE UserID = P_UserID AND UserRole.RoleID = RoleAction.RoleID)
UNION ALL
SELECT ActionID FROM UserAction WHERE UserID = P_UserID
),
T1 AS (
SELECT A.ID, A.ParentID FROM Action A JOIN T ON A.ID = T.ActionID
UNION ALL
SELECT A.ID, A.ParentID FROM Action A JOIN T1 ON A.ID = T1.ParentID
),
T2 AS (
SELECT DISTINCT ActionCode FROM Action A JOIN T1 ON A.ID = T1.Action
)
SELECT WM_CONCAT(ActionCode) INTO RET FROM T2;
SELECT RET;
END P_Permission_GetUserPermission;---------------------------------
这个存储过程的功能是获取某个用户的权限代码。
但我怎么搞都搞不同。
(
P_UserID IN NUMBER
)
AS
RET VARCHAR2(4000);
BEGIN
RET := '';
WITH T AS (
SELECT DISTINCT ActionID FROM RoleAction WHERE EXISTS(SELECT 1 FROM UserRole WHERE UserID = P_UserID AND UserRole.RoleID = RoleAction.RoleID)
UNION ALL
SELECT ActionID FROM UserAction WHERE UserID = P_UserID
),
T1 AS (
SELECT A.ID, A.ParentID FROM Action A JOIN T ON A.ID = T.ActionID
UNION ALL
SELECT A.ID, A.ParentID FROM Action A JOIN T1 ON A.ID = T1.ParentID
),
T2 AS (
SELECT DISTINCT ActionCode FROM Action A JOIN T1 ON A.ID = T1.Action
)
SELECT WM_CONCAT(ActionCode) INTO RET FROM T2;
SELECT RET;
END P_Permission_GetUserPermission;---------------------------------
这个存储过程的功能是获取某个用户的权限代码。
但我怎么搞都搞不同。
解决方案 »
- pl/sql中对sum结果求和的问题!!
- ORA-12516:TNS:监听程序找不到符合协议堆栈要求的可用处理程序
- 初学oracle事务控制问题,以前是学习mssql的,希望oracle大佬帮忙一下!!
- oracle817的问题
- 文件导入数据库问题. 请各位帮忙
- 高分求救!LONG数据类型,如何知道有没有包含某字符???
- oracale数据库问题,请大家指教!!
- 移植oracle for win到另一个windows(我会很快可以结帖)
- 求求兄弟帮帮忙,我的一update SQL语句为什么不能执行 在线等待呀
- 求oracle9i的示例数据库(脚本)(分不够再加)
- oracle 三表链接查询问题
- 异常处理问题
开发oracle很恼火。
在oracle下怎么写呢?
SELECT A.ID, A.ParentID FROM Action A JOIN T ON A.ID = T.ActionID
UNION ALL
SELECT A.ID, A.ParentID FROM Action A JOIN T1 ON A.ID = T1.ParentID
),
这里面怎么引用了自己
T2 AS (
SELECT DISTINCT ActionCode FROM Action A JOIN T1 ON A.ID = T1.Action
) 这里t1.action没有在t1里定义啊SELECT RET; 这是什么
P_UserID IN NUMBER
)
-->(
P_UserID IN NUMBER,
o_Ret OUT varchar2
) T2 AS (
SELECT DISTINCT ActionCode FROM Action A JOIN T1 ON A.ID = T1.Action
)
SELECT WM_CONCAT(ActionCode) INTO RET FROM T2;
SELECT RET; ->T2 AS (
SELECT DISTINCT ActionCode FROM Action A JOIN T1 ON A.ID = T1.ID
)
SELECT WM_CONCAT(ActionCode) INTO RET FROM T2;
o_Ret :=RET;
exception when others then
raise;
最重要的是CTE
CTE 是一种临时命名的结果集,可通过定义语句加以引用。可在查询的 FROM 子句中引用 CTE,这与引用派生表和视图的方法相同。sql2005本身及以上才支持CTE,CTE通过关键字WITH建立.Oracle目前版本应该还没有CTE这样的用法,所以怎么能对呢?
WITH CTE_name[ (column_name [,...n] ) ]AS( CTE_query_specification )
(
P_UserID IN NUMBER,
o_Ret OUT varchar2
)
IS
BEGIN
WITH T AS (
SELECT DISTINCT ActionID FROM RoleAction WHERE EXISTS(SELECT 1 FROM UserRole WHERE UserID = P_UserID AND UserRole.RoleID = RoleAction.RoleID)
UNION ALL
SELECT ActionID FROM UserAction WHERE UserID = P_UserID
),
T1 AS (
SELECT A.ID, A.ParentID FROM Action A JOIN T ON A.ID = T.ActionID
UNION ALL
SELECT A.ID, A.ParentID FROM Action A JOIN T1 ON A.ID = T1.ParentID
),
T2 AS (
SELECT DISTINCT ActionCode FROM Action A JOIN T1 ON A.ID = T1.ID
)
SELECT WM_CONCAT(ActionCode) INTO RET FROM T2;
o_Ret :=RET;
exception when others then
raise;
END P_Permission_GetUserPermission;---------------
但还是有错:Warning: PROCEDURE created with compilation errors.
看看报什么错。
SELECT A.ID, A.ParentID FROM Action A JOIN T ON A.ID = T.ActionID
UNION ALL
SELECT A.ID, A.ParentID FROM Action A JOIN T1 ON A.ID = T1.ParentID
), -->这里怎么union all里面有自己(T1)???
SELECT A.ID, A.ParentID FROM Action A JOIN T ON A.ID = T.ActionID
UNION ALL
SELECT A.ID, A.ParentID FROM Action A JOIN T1 ON A.ID = T1.ParentID
),-->这里怎么union all里面有自己(T1)???
----------------------------------------------
SQL SERVER 里面通过这种方式可以循环获取数据。
----------
2
1SQL> select * from t_org; ID CODE PID NAME
---------- -------- ---------- ------------------------------------------------------
-------------------------------------------------------------------------------------
1 YKBD 35kV玉坑变
2 KZKX 1 坑仔口线625
3 KDX1 1 魁斗线623
4 YDX6 1 玉斗线611
5 AAX1 2 AA线
6 ZFX1 1 竹凤线613
7 BBX1 5 BB线
8 CCX1 7 CC线
9 DDX1 7 DD线
10 4JX1 8 4级支线1
11 4JX2 8 4级支线2
12 4JX3 9 4级支线3
13 4JX4 9 4级支线4
14 YXBD 10 玉西13#变
15 PLKQ 12 盘龙山矿泉水专变
16 XXBD 11 XX变已选择16行。
----------
12
9
7
5
2
1已选择6行。
能这样写吗?
SELECT ID, ParentID FROM Action START WITH ID IN (SELECT ActionID FROM T) CONNECT BY PRIOR ParentID = ID;
-----------------------------------
CREATE OR REPLACE PROCEDURE P_Permission_GetUserPermission
(
P_UserID IN NUMBER,
o_Ret OUT varchar2
)
IS
BEGIN
WITH T AS (
SELECT DISTINCT ActionID FROM RoleAction WHERE EXISTS(SELECT 1 FROM UserRole WHERE UserID = P_UserID AND UserRole.RoleID = RoleAction.RoleID)
UNION ALL
SELECT ActionID FROM UserAction WHERE UserID = P_UserID
),
T1 AS (
SELECT ID, ParentID FROM Action START WITH ID IN (SELECT ActionID FROM T) CONNECT BY PRIOR ParentID = ID
),
T2 AS (
SELECT DISTINCT ActionCode FROM Action A JOIN T1 ON A.ID = T1.ID
)
SELECT WM_CONCAT(ActionCode) INTO RET FROM T2;
o_Ret :=RET;
exception when others then
raise;
END P_Permission_GetUserPermission;
--------------
这样还是有错
----------
11
8
7
5
2
1
12
9
7
5
2
1已选择12行。可以这么写,但不知道oracle怎么用with t,t1,t2你这里好像是嵌套查询。不如你用select * from
(select * from
(select * from Action a,....
)t1
where t1.**...
)t2
where t2...
这种嵌套的方式来做呢?
from
(
SELECT DISTINCT ActionCode FROM Action A,
(
SELECT ID, ParentID FROM Action START WITH ID IN
(
SELECT ActionID FROM
(
SELECT DISTINCT ActionID FROM RoleAction WHERE EXISTS
(
SELECT 1 FROM UserRole WHERE UserID = P_UserID
AND UserRole.RoleID = RoleAction.RoleID
)
UNION ALL
SELECT ActionID FROM UserAction WHERE UserID = P_UserID
)
)
CONNECT BY PRIOR ParentID = ID
)t1
where a.id = t1.id
);
from
(
SELECT DISTINCT ActionCode FROM Action A,
(
SELECT ID, ParentID FROM Action START WITH ID IN
(
SELECT ActionID FROM
(
SELECT DISTINCT ActionID FROM RoleAction WHERE EXISTS
(
SELECT 1 FROM UserRole WHERE UserID = P_UserID
AND UserRole.RoleID = RoleAction.RoleID
)
UNION ALL
SELECT ActionID FROM UserAction WHERE UserID = P_UserID
)
)
CONNECT BY PRIOR ParentID = ID
)t1
where a.id = t1.id
);
--------------CREATE OR REPLACE PROCEDURE P_Permission_GetUserPermission
(
P_UserID IN NUMBER,
o_Ret OUT varchar2
)
IS
BEGIN
WITH T AS (
SELECT DISTINCT ActionID FROM RoleAction WHERE EXISTS(SELECT 1 FROM UserRole WHERE UserID = P_UserID AND UserRole.RoleID = RoleAction.RoleID)
UNION ALL
SELECT ActionID FROM UserAction WHERE UserID = P_UserID
),
T1 AS (
SELECT ID, ParentID FROM Action START WITH ID IN (SELECT ActionID FROM T) CONNECT BY PRIOR ParentID = ID
),
T2 AS (
SELECT DISTINCT ActionCode FROM Action A JOIN T1 ON A.ID = T1.ID
)
SELECT WM_CONCAT(ActionCode) INTO o_Ret FROM T2;
exception when others then
raise;
END P_Permission_GetUserPermission;
---------------
这样可以运行了