gpt4 book ai didi

sql - PL/SQL : bind variable does not exist

转载 作者:行者123 更新时间:2023-12-01 01:20:53 27 4
gpt4 key购买 nike

如何修改此过程以使其使用绑定(bind)变量

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;

它给:

bind variable does not exist

最佳答案

语句中的绑定(bind)变量被视为文字字符串而不是占位符。如果您输出您正在生成的语句:

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;
/

...您会看到如下行:
alter system kill session ':1,:2' immediate
':1,:2'被视为静态值而不是两个绑定(bind)变量。您不能在动态 DDL 中使用绑定(bind)变量,我不确定这是否适用于 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;
/

execute注释掉(我现在真的不想杀死我的 session )你可以看到它将运行的命令,比如:
alter system kill session '58,47157' immediate

您的方法可能仍然存在缺陷,因为它会终止正在执行该 block 的 session ,并且它可能会或可能不会最后终止它。我认为这是在未定义行为的领域,我真的不想尝试找出会发生什么......我怀疑这就是你真正想要的。

编辑: “有缺陷”的评论基于使用 user ,在我的匿名 block 中将是执行用户;在您的过程中,它将是参数中的用户。不过,使用关键字作为参数名称会令人困惑,因此我建议将名称更改为 p_user 之类的名称。 , 在 args 和语句中。

关于sql - PL/SQL : bind variable does not exist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9308559/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com