Oracle
 sql >> Base de données >  >> RDS >> Oracle

pl/sql - Utilisation d'une requête dynamique dans une procédure stockée

Ne construisez pas votre requête en ajoutant des chaînes. Vous vous exposez à de nombreux bogues et vulnérabilités, en premier lieu à l'injection SQL. La nécessité d'utiliser des requêtes dynamiques ne justifie pas de ne pas utiliser de variables de liaison. Si vous avez vraiment besoin d'utiliser des requêtes dynamiques (il n'est pas clair d'après votre exemple pourquoi la mise à jour statique ne fonctionnerait pas ? !), faites plutôt ceci :

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 se liera correctement avec le type approprié.