【发布时间】:2018-04-03 12:28:55
【问题描述】:
我现在很困惑;我正在编写一个脚本来查找用户继承的所有角色。这是一项正在进行中的工作,由于我对 PLSQL 缺乏了解,如果你明白我的意思的话,并没有太大的进展。
-- Declaration of Table Type
create or replace TYPE TEST
AS TABLE OF VARCHAR(30);
-- Function here
create or replace FUNCTION FINDPARENTS
(
ROLENAME IN VARCHAR2
)
RETURN TEST
IS
tt_t TEST;
BEGIN
DECLARE
results test;
toadd test := TEST(ROLENAME);
counter number;
elements number:=1;
BEGIN
SELECT GRANTED_ROLE
BULK COLLECT INTO toadd
FROM DBA_ROLE_PRIVS
WHERE GRANTEE = rolename;
SELECT COUNT(*)
INTO ELEMENTS
FROM toadd; -- Error here.
--(for i in 0 .. ELEMENTS) SELECT FINDPARENTS(ROLE_NAME) FROM DUAL UNION RESULT ... or something.
END;
END;
此代码导致“找不到表或视图”错误,因为在第二行 (Select Count(*)...) 中找不到“toadd”,尽管它可以在上面的语句中找到 (Select GRANTED_ROLE...) 这怎么可能?
另外,实现递归的最佳方法是什么?我的函数返回一个 VARCHAR 表,我如何让它“解析”每个角色名称,直到该角色不再具有父角色?
【问题讨论】:
-
第二个问题请参考asktom.oracle.com/pls/asktom/…
-
真的两个问题应该是两个帖子,但由于第一个问题回答得如此之快,我为第二个问题提供了奖励解决方案;)
-
顺便说一句,您不需要
BEGIN DECLARE或END关键字之一。此外,一个集合有一个count方法,所以你不需要 SQL 来找出它有多少元素。
标签: sql oracle plsql oracle11g