如何修改此过程以使其使用绑定变量
PROCEDURE KILL(user IN VARCHAR2) AS
BEGIN
FOR REC IN (SELECT sid,serial# serial FROM V$SESSION WHERE username = user)
LOOP
execute immediate 'alter system kill session '' :1 , :2 '' immediate'
using rec.sid, rec.serial;
END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)
它给:
绑定变量不存在
语句中的绑定变量被视为文字字符串而不是占位符.如果输出正在生成的语句:
BEGIN
FOR REC IN (SELECT sid,serial# serial FROM V$SESSION WHERE username = user)
LOOP
dbms_output.put_line('alter system kill session '':1,:2'' immediate');
END LOOP;
END;
/
Run Code Online (Sandbox Code Playgroud)
...你看到如下行:
alter system kill session ':1,:2' immediate
Run Code Online (Sandbox Code Playgroud)
它':1,:2'
被视为静态值而不是两个绑定变量.您不能在动态DDL中使用绑定变量,我不确定这是否适用于alter
命令,因此无论如何这可能是不可能的.
实现此目的的最简单方法可能是在游标中生成整个语句:
BEGIN
FOR REC IN (
SELECT 'alter system kill session ''' || sid ||','|| serial#
||''' immediate' stmt
FROM V$SESSION WHERE username = user)
LOOP
dbms_output.put_line(rec.stmt);
--execute immediate rec.stmt;
END LOOP;
END;
/
Run Code Online (Sandbox Code Playgroud)
随着execute
注释(我不想立即杀死我的会话)你可以看到它将运行的命令,如:
alter system kill session '58,47157' immediate
Run Code Online (Sandbox Code Playgroud)
你的方法可能仍然有缺陷,因为它会杀死正在执行块的会话,并且它可能会或可能不会最后杀死它.我认为这是未定义行为的领域,我真的不想尝试找出发生的事情......我怀疑这是你真正想要的东西.
编辑: '有缺陷'的评论基于使用user
,在我的匿名块中将是执行用户; 在你的proc中,它将是参数的用户.使用关键字作为参数名称会令人困惑,所以我建议p_user
在args和语句中将名称更改为类似的名称.
归档时间: |
|
查看次数: |
9697 次 |
最近记录: |