下面的脚本将查找并终止特定模式的所有会话,然后删除该模式。它运行完美,所以我想继续使用它。但是,我也希望允许提示运行它的人输入架构名称,而不是像当前设置的那样编辑代码。
我尝试过ACCEPT,我尝试过&&,但我似乎不太正确。
有什么建议吗?
DECLARE
v_user_exists NUMBER;
user_name CONSTANT varchar2(20) := 'FRED_2'; --this is where the user to delete is specified
BEGIN
LOOP
FOR c IN (SELECT s.sid, s.serial# FROM v$session s WHERE upper(s.username) = user_name)
LOOP
EXECUTE IMMEDIATE
'alter system kill session ''' || c.sid || ',' || c.serial# || ''' IMMEDIATE';
END LOOP;
BEGIN
EXECUTE IMMEDIATE 'drop user ' || user_name || ' cascade';
EXCEPTION WHEN OTHERS THEN
IF (SQLCODE = -1940) THEN
NULL;
ELSE
RAISE;
END IF;
END;
BEGIN
SELECT COUNT(*) INTO v_user_exists FROM dba_users WHERE username = user_name;
EXIT WHEN v_user_exists = 0;
END;
END LOOP;
END;
/
您已经使用PL / SQL,为什么要在匿名PL / SQL块中使用它?切换到存储过程,并将用户名作为parameter传递。像这样的东西:
create or replace procedure p_kill (par_username in varchar2)
is
v_user_exists number
user_name varchar2(20);
begin
user_name := par_username;
loop
for c in ...
end loop;
end;
/
(通过SQL * Plus或SQL Developer执行)为>
exec p_kill('FRED_2');
或-任意位置-为
begin exec p_kill('FRED_2'); end; /
如果您要坚持当前代码,则
&
可以帮助:
SQL> declare 2 user_name varchar2(20) := '&user_name'; 3 begin 4 dbms_output.put_line('entered value = ' || user_name); 5 end; 6 / Enter value for user_name: LITTLEFOOT entered value = LITTLEFOOT PL/SQL procedure successfully completed. SQL>
当您在同一代码中多次引用同一替换变量时,使用
&&
。对于下一次执行(具有新值),您首先必须undefine
它。