gpt4 book ai didi

oracle - pl/sql - 在存储过程中使用动态查询

转载 作者:行者123 更新时间:2023-12-01 07:11:39 28 4
gpt4 key购买 nike

我正在使用存储过程使用游标将数据插入临时表。
此过程将动态查询存储在变量中以挂载插入/更新命令。

这是代码(不是完整的查询,我删掉了一些部分以便于阅读):

 FOR VC2 IN (SELECT C.OBJETIVO,
C.AUDITORIA ,
C.NOME,
C.PRODUTO
FROM CALCULO C)
LOOP

SELECT ' V_UPD NUMBER := 0;

SELECT (SELECT ID_TIPO_TERR
FROM ZREPORTYTD_TMP
WHERE AUDITORIA = ''' || VC2.AUDITORIA || '''
AND TERRITORIO = ''' || VC2.NOME || '''
AND PRODUTO = ''' || VC2.PRODUTO || ''')
INTO V_UPD FROM DUAL;

UPDATE ZReportYTD_TMP
SET TARGET = ' || VC2.OBJETIVO || '
WHERE AUDITORIA = ''' || VC2.AUDITORIA || '''
AND TERRITORIO = ''' || VC2.NOME || '''
AND PRODUTO = ''' || VC2.PRODUTO || ''';'

INTO V_SQL FROM DUAL;

EXECUTE IMMEDIATE (V_SQL);

END LOOP

在动态查询中,在这部分 "SET TARGET = ' || VC2.OBJETIVO || '"VC2.OBJETIVONumber类型,它被替换为“62481,76”。换句话说,这个逗号使命令出错并且不起作用。

有没有一种简单的方法可以将“,”替换为“。”?

非常感谢你! (:

最佳答案

不要通过附加字符串来构建查询。首先是 SQL 注入(inject),您会让自己面临许多错误和漏洞。需要使用动态查询并不能证明不使用绑定(bind)变量是合理的。如果您确实需要使用动态查询(从您的示例中不清楚为什么静态更新不起作用?!),请改为:

FOR vc2 IN (...) LOOP
v_sql :=
'BEGIN
V_UPD NUMBER := 0;

SELECT (SELECT ID_TIPO_TERR
FROM ZREPORTYTD_TMP
WHERE AUDITORIA = :p1
AND TERRITORIO = :p2
AND PRODUTO = :p3)
INTO V_UPD FROM DUAL;

UPDATE ZReportYTD_TMP
SET TARGET = :p4
WHERE AUDITORIA = :p5
AND TERRITORIO = :p6
AND PRODUTO = :p7;
END';
EXECUTE IMMEDIATE v_sql USING VC2.AUDITORIA, VC2.NOME, VC2.PRODUTO,
VC2.OBJETIVO, VC2.AUDITORIA, VC2.NOME,
VC2.PRODUTO;
END LOOP;

Oracle 将正确绑定(bind)到适当的类型。

关于oracle - pl/sql - 在存储过程中使用动态查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5007725/

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