sql >> Base de Datos >  >> RDS >> Oracle

pl/sql:uso de una consulta dinámica dentro de un procedimiento almacenado

No cree su consulta agregando cadenas. Te expones a muchos errores y vulnerabilidades, en primer lugar a la inyección de SQL. La necesidad de usar consultas dinámicas no justifica no usar variables de vinculación. Si realmente necesita usar consultas dinámicas (no está claro en su ejemplo por qué la actualización estática no funcionaría), haga esto en su lugar:

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 enlazará correctamente con el tipo apropiado.