Oracle 12.2:如何让SQL * Plus或SQL Developer提示用户输入变量?

问题描述 投票:0回答:1

下面的脚本将查找并终止特定模式的所有会话,然后删除该模式。它运行完美,所以我想继续使用它。但是,我也希望允许提示运行它的人输入架构名称,而不是像当前设置的那样编辑代码。

我尝试过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;
/
oracle variables sqlplus prompt
1个回答
1
投票

您已经使用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它。

© www.soinside.com 2019 - 2024. All rights reserved.