oracle - 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;
/
解决方案
既然您已经在使用 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
它。
推荐阅读
- windows - 如何在 Windows 10 文件资源管理器中搜索 2+ 个空格?
- wso2 - 登录 uri 'analytics-dashboard' 时出错。错误:AM_DB 数据库中不存在 AM_SYSTEM_APPS - 在分析快速设置中
- install4j - Install4j 中 Windows 安装程序的自定义脚本
- python - 如何在熊猫中删除一列
- android - snapshot.hasData 返回一个空数组
- php - 如何将质量分配与两个模型一起使用?
- assembly - 为 ARM 发布交叉编译 FreeRTOS 程序
- sql - 如何在选择中使用选择将查询转换为 Oracle
- windows - 无法在 Docker Windows 容器中执行第三方 Exe 文件
- oracle - 更新查询在 oracle sql developer 中不起作用,错误是什么?