Oracle Live SQL中无法执行DBA_ROLE存储过程的问题求助
解决Oracle存储过程参数传递问题
首先,你的存储过程没有定义输入参数,这是调用时报错PLS-00306的核心原因。要实现传入两个字符串参数的需求,需先修改存储过程的定义,添加参数声明。
1. 修改存储过程定义
注意:user是Oracle的保留关键字,不要用作变量名,建议替换为类似p_grantee的命名,避免语法冲突。修改后的存储过程代码如下:
create or replace procedure dba_role( p_grantee varchar2(200), -- 第一个输入参数:被授权者 p_ref_grantee varchar2(200) -- 第二个输入参数:参考的被授权者 ) as begin insert into dba_role_privs(grantee, granted_role) select p_grantee as grantee, granted_role from dba_role_privs where grantee = p_ref_grantee; end; /
说明:
- 在存储过程名称后用括号声明两个
IN类型参数(Oracle默认参数类型为IN) - 替换原代码中存在关键字冲突的
user变量,改用自定义参数名 - 执行部分直接使用传入的参数进行查询和插入
2. 在Oracle Live SQL中执行存储过程
有两种常用执行方式:
方式一:使用EXECUTE(简写EXEC)命令
EXECUTE dba_role('alex', 'hunter'); -- 或简写 EXEC dba_role('alex', 'hunter');
方式二:使用PL/SQL匿名块
BEGIN dba_role('alex', 'hunter'); END; /
注意:
dba_role_privs是Oracle系统视图,默认是只读的,你无法直接插入数据到这个视图。如果是自定义的同名表,确保表结构匹配且你有写入权限;如果是误操作系统视图,建议改为自定义表名(比如my_dba_role_privs)来测试。
内容的提问来源于stack exchange,提问作者saiteja damaraju
相关产品推荐
相关产品推荐

