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

pl/sql - Brug af en dynamisk forespørgsel i en lagret procedure

Lav ikke din forespørgsel ved at tilføje strenge. Du efterlader dig selv åben over for masser af fejl og sårbarheder, først og fremmest SQL-injektion. Behovet for at bruge dynamiske forespørgsler retfærdiggør ikke, at man undlader at bruge bindevariabler. Hvis du virkelig har brug for at bruge dynamiske forespørgsler (det fremgår ikke klart af dit eksempel, hvorfor statisk opdatering ikke ville fungere?!), skal du gøre dette i stedet:

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 binder korrekt med den passende type.



  1. Hvordan bruger man Oracles globale midlertidige tabel?

  2. String -> java.util.Date -> java.sql.Date (med tidsstempel)

  3. Java - Hentning af data fra MySQL-database

  4. Citerer kolonnenavne med NHibernate og PostgreSQL