Oracle
 sql >> Datenbank >  >> RDS >> Oracle

pl/sql - Verwenden einer dynamischen Abfrage innerhalb einer gespeicherten Prozedur

Erstellen Sie Ihre Abfrage nicht durch Anhängen von Zeichenfolgen. Sie lassen sich vielen Fehlern und Schwachstellen aussetzen, allen voran der SQL-Injektion. Die Notwendigkeit, dynamische Abfragen zu verwenden, rechtfertigt nicht die Verwendung von Bind-Variablen. Wenn Sie wirklich dynamische Abfragen verwenden müssen (aus Ihrem Beispiel geht nicht hervor, warum die statische Aktualisierung nicht funktionieren würde?!), tun Sie stattdessen Folgendes:

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 bindet korrekt mit dem entsprechenden Typ.