无法在oracle live sql上执行sql过程

dgsult0t  于 2023-01-01  发布在  Oracle
关注(0)|答案(2)|浏览(195)

我创建了一个程序

create or replace procedure dba_role 
as 
   user  varchar2(200); 
   ref   varchar2(200);  
   
begin  
   
  insert into dba_role_privs(grantee,granted_role) (select user as grantee,granted_role from dba_role_privs where grantee=ref);
 
end;

正在创建过程,但我无法执行该过程。我尝试了不同的方法通过传递参数来执行它,但没有任何效果。
有谁能告诉我如何在oracle live SQL中执行这个过程吗?要传递的参数都是字符串(varchar)
例如:* * 我尝试过"执行dba_role('alex ','hunter');**
错误为****ORA-06550:第1行,第7列:**PLS-00306:调用"DBA_ROLE"时参数的数目或类型错误

az31mfrm

az31mfrm1#

以及缺少您尝试传递的两个参数(参数应该出现在过程名后面的方括号中,如d r's answer中所述),但不能插入到DBA视图中。(除非您要将过程创建为SYS,但您永远不应该这样做,因为SYS是为Oracle内部保留的),并且您没有被授予INSERT权限,而且还因为它定义了多个连接和联合等,因此不是一个可更新的视图。即使它是,您的过程只指定了它的七列中的两列。
即使您确实具有权限并且可以更新,而且您提供了所有值,但直接更新内部数据字典表仍不受支持,并且可能会损坏数据库。如果要向角色授予权限,应使用GRANT命令:

grant reports_user to hr;

为了撤销授权,

revoke reports_user from hr;
flseospp

flseospp2#

create or replace procedure 
    dba_role(p_user IN VarChar2, p_ref IN VarChar2) AS  

begin  
  insert into dba_role_privs(grantee, granted_role) (select p_user as grantee, granted_role from dba_role_privs where grantee = p_ref);
end dba_role; 
/

上面是它的定义方式--使用两个VarChar 2参数。下面是它的调用方式:

Begin
    dba_role('alex', 'hunter');
End;
/

您的代码的问题在于user和ref被声明为过程作用域内的变量(而不是参数),因此,当使用参数调用过程时(就像我上面所做的那样),您试图将两个参数传递给不接受任何参数的过程。***),则用户和引用都为空。

相关问题