Oracle
 sql >> Database >  >> RDS >> Oracle

pl/sql - Utilizzo di una query dinamica all'interno di una procedura memorizzata

Non creare la tua query aggiungendo stringhe. Ti lasci aperto a molti bug e vulnerabilità, prima di tutto SQL injection. La necessità di utilizzare query dinamiche non giustifica il mancato utilizzo di variabili bind. Se hai davvero bisogno di utilizzare query dinamiche (dal tuo esempio non è chiaro perché l'aggiornamento statico non funzionerebbe?!), fallo invece:

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 si legherà correttamente con il tipo appropriato.