问题描述
嗨,汤姆,
我创建了一个函数,该函数向给定用户授予对给定架构中表和视图的访问权限。
结果,函数返回一个自己类型的表,其中包含准备好的语句和异常消息 (如果抛出)。
1.创建类型:
2.函数本身:
函数正确构建。
之后,在SQL developer中使用standart sql sheet,我正在执行以下查询:
之后的查询结果会显示该表的声明,而不是其中的数据...
我做错了什么?
我创建了一个函数,该函数向给定用户授予对给定架构中表和视图的访问权限。
结果,函数返回一个自己类型的表,其中包含准备好的语句和异常消息 (如果抛出)。
1.创建类型:
CREATE OR REPLACE TYPE STATEMENT_RESULT AS OBJECT ( sql_statement varchar2(2000), statement_result varchar(2000) ); CREATE OR REPLACE TYPE STATEMENT_RESULTS AS TABLE OF STATEMENT_RESULT;复制
2.函数本身:
create or replace function GRANT_ACCESS_TO_SCHEMA_RES ( RESOURCE_SCHEMA IN VARCHAR2 , GRANTEE IN VARCHAR2 , ACCESS_TYPE IN VARCHAR2 , ALLOW_FURTHER_SHARING IN NUMBER DEFAULT 0 ) return statement_results is --DIMS pragma autonomous_transaction; sql_to_execute varchar2(2000); results statement_results; --BODY BEGIN results := statement_results(); --MANAGE TABLES for tab in (select table_name from all_tables where owner = RESOURCE_SCHEMA) loop --ADD NEW GRANT sql_to_execute:= 'GRANT ' || ACCESS_TYPE || ' ON ' || RESOURCE_SCHEMA || '.' || tab.table_name || ' TO ' || GRANTEE; if ALLOW_FURTHER_SHARING = 1 then sql_to_execute:= sql_to_execute || ' WITH GRANT OPTION'; end if; BEGIN EXECUTE IMMEDIATE sql_to_execute; EXCEPTION WHEN others THEN results.extend; results(results.last) := statement_result(sql_to_execute, SQLERRM); END; end loop; --MANAGE VIEWS for tab in (select view_name from all_views where owner = RESOURCE_SCHEMA) loop --ADD NEW GRANT sql_to_execute:= 'GRANT ' || ACCESS_TYPE || ' ON ' || RESOURCE_SCHEMA || '.' || tab.view_name || ' TO ' || GRANTEE; if ALLOW_FURTHER_SHARING = 1 then sql_to_execute:= sql_to_execute || ' WITH GRANT OPTION'; end if; BEGIN EXECUTE IMMEDIATE sql_to_execute; EXCEPTION WHEN others THEN results.extend; results(results.last) := leo_sysdba.statement_result(sql_to_execute, SQLERRM); END; end loop; return results; END GRANT_ACCESS_TO_SCHEMA_RES;复制
函数正确构建。
之后,在SQL developer中使用standart sql sheet,我正在执行以下查询:
select GRANT_ACCESS_TO_SCHEMA_RES('', ' ', 'SELECT', 0) from dual; 复制
之后的查询结果会显示该表的声明,而不是其中的数据...
STATEMENT_RESULTS([STATEMENT_RESULT], [STATEMENT_RESULT], ... )复制
我做错了什么?
专家解答
您的函数返回STATEMENT_RESULTS类型的对象。这就是你在结果中看到的。
如果要将其视为 “适当的” 行和列,请在表运算符中调用该函数。这将为您进行转换:
如果要将其视为 “适当的” 行和列,请在表运算符中调用该函数。这将为您进行转换:
select * from table ( GRANT_ACCESS_TO_SCHEMA_RES('CHRIS', 'HR', 'SELECT', 0) ) SQL_STATEMENT STATEMENT_RESULT GRANT SELECT ON CHRIS.ORDER TO HR ORA-00903: invalid table name 复制
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
Oracle RAC ASM 磁盘组满了,无法扩容怎么在线处理?
Lucifer三思而后行
942次阅读
2025-03-17 11:33:53
Oracle DataGuard高可用性解决方案详解
孙莹
400次阅读
2025-03-26 23:27:33
墨天轮个人数说知识点合集
JiekeXu
345次阅读
2025-04-01 15:56:03
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
334次阅读
2025-04-08 09:12:48
Oracle SQL 执行计划分析与优化指南
Digital Observer
303次阅读
2025-04-01 11:08:44
风口浪尖!诚通证券扩容采购Oracle 793万...
Roger的数据库专栏
283次阅读
2025-03-24 09:42:53
Oracle 19c RAC更换IP实战,运维必看!
szrsu
282次阅读
2025-04-08 23:57:08
切换Oracle归档路径后,不能正常删除原归档路径上的归档文件
dbaking
278次阅读
2025-03-19 14:41:51
oracle定时任务常用攻略
virvle
273次阅读
2025-03-25 16:05:19
Oracle NetSuite 客户说|健合(H&H)集团部署 Oracle NetSuite,全面提升全球运营效率
甲骨文中国
254次阅读
2025-03-28 15:00:30