首页 > 解决方案 > Oracle 12.2:如何让 SQL*Plus 或 SQL Developer 提示用户输入变量?

问题描述

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

我试过 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;
/

标签: oraclevariablessqlplusprompt

解决方案


既然您已经在使用 PL/SQL,为什么还要在匿名 PL/SQL 块中使用它?切换到存储过程并将用户名作为参数传递。像这样的东西:

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它。


推荐阅读