gpt4 book ai didi

sql - 使用绑定(bind)变量进行动态 SQL 更新

转载 作者:行者123 更新时间:2023-12-04 21:27:07 25 4
gpt4 key购买 nike

我在动态 sql 中有一个像这样的更新语句:

varDynQuery := 'UPDATE TABLE SET B0 = ' || A0;

IF(A1 IS NOT NULL) THEN
varDynQuery := varDynQuery || ', B1 = ' || A1;
END IF;

IF(A2 IS NOT NULL) THEN
varDynQuery := varDynQuery || ', B2 = ' || A2;
END IF;

我想将其更改为使用绑定(bind)变量来防止 SQL 注入(inject)

varDynQuery := 'UPDATE TABLE SET B0 = :A0';

IF(A1 IS NOT NULL) THEN
varDynQuery := varDynQuery || ', B1 = :A1';
END IF;

IF(A2 IS NOT NULL) THEN
varDynQuery := varDynQuery || ', B2 = :A2';
END IF;

EXECUTE IMMEDIATE varDynQuery USING
A0, A1, A2;

但是,由于 A1 和 A2 并不总是存在,因此可能会在过程运行时导致错误。

有什么方法可以塑造SQL语句,使得所有变量都可以成功绑定(bind),而无需更新那些需要排除的变量?

注意:希望避免使用合并。

最佳答案

只需确保包含所有绑定(bind)变量,例如:

varDynQuery := 'UPDATE TABLE SET B0 = :A0,
B1 = NVL(:A1,B1),
B2 = NVL(:A2,B2)';

EXECUTE IMMEDIATE varDynQuery USING
A0, A1, A2;

这种方法的优点是只有一个查询需要解析,这意味着共享池的负载较小。

唯一的缺点是,如果您有任何特定于列的触发器,即使它们没有被更改,它们也会为 B1 和 B2 触发。

如果这是个问题,您需要对四种更新场景(例如 B0;B0+B1;B0+B2;B0+B1+B2)中的每一种使用不同的立即执行

关于sql - 使用绑定(bind)变量进行动态 SQL 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29273207/

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