sql >> Databasteknik >  >> RDS >> Oracle

pl/sql - Använda en dynamisk fråga i en lagrad procedur

Bygg inte din fråga genom att lägga till strängar. Du lämnar dig själv öppen för massor av buggar och sårbarheter, först och främst SQL-injektion. Behovet av att använda dynamiska frågor motiverar inte att man inte använder bindningsvariabler. Om du verkligen behöver använda dynamiska frågor (det framgår inte av ditt exempel varför statisk uppdatering inte skulle fungera?!), gör så här istället:

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 kommer att binda korrekt med lämplig typ.



  1. Laravel släpper främmande nyckel i migration

  2. Hur man installerar Haproxy och Keepalved

  3. Jag kan inte använda MySQL på grund av en vägrad anslutning

  4. Kopiera en enorm MySQL-tabell från en fjärrkontroll till en lokal databas