执行SQL脚本

时间:2013-02-11 21:49:20

标签: sql plsql oracle11g

我跑的时候

SQL>execute deactivate_user

我收到错误:

SQL> exec deactivate_user
BEGIN deactivate_user; END;

  *

第1行的错误: ORA-06550:第1行第7列: PLS-00306:调用'DEACTIVATE_USER'时参数的数量或类型错误 ORA-06550:第1行第7列: PL / SQL:忽略语句

这是我的代码:

create or replace procedure deactivate_user 
(
p_username varchar2
)
as
l_username varchar2(30):=upper(p_username);
cnmd varchar2(50);
begin
    for rec in (select privilege, admin_option from dba_sys_privs
            where grantee =l_username) loop
            cnmd := 'REVOKE '||rec.privilege||' from '||l_username;
execute immediate cnmd;
end loop;
end;
/

3 个答案:

答案 0 :(得分:2)

create or replace procedure deactivate_user 
(
p_username varchar2
)

您的程序期望输入(没有默认值,因此必须提供输入)。

SQL> exec deactivate_user

您需要传入您尝试停用的用户ID。像。的东西。

SQL> exec deactivate_user('USER1');

答案 1 :(得分:0)

另外:

create or replace procedure deactivate_user 
(
 p_username varchar2 DEFAULT 'USER1'
)
....

然后您不需要输入p_username的值。但默认情况下,除非您按照Rajesh的示例更改参数,否则将始终为“USER1”执行您的过程。

答案 2 :(得分:0)

是的,您需要在根据您的代码调用存储过程时传递参数。

如下:

exec deactivate_user('USERname1');

但是如果你不想传递任何输入值,那么只要你调用sp就设置参数默认参数,那么它将采用自动默认值。

如下

create or replace procedure deactivate_user 
(
 p_username varchar2 DEFAULT 'USERname1'
)

.... 然后,您无需输入p_username的值。但默认情况下,除非您更改参数值,否则将始终为“USERname1”执行过程。

然后你将调用上述程序,如:

exec deactivate_user;