sql >> Databáze >  >> RDS >> Oracle

pl/sql - Použití dynamického dotazu uvnitř uložené procedury

Nevytvářejte dotaz přidáváním řetězců. Necháte se otevření spoustě chyb a zranitelností, především SQL injection. Potřeba používat dynamické dotazy neospravedlňuje nepoužívání proměnných vazeb. Pokud opravdu potřebujete použít dynamické dotazy (z vašeho příkladu není jasné, proč by statická aktualizace nefungovala?!), udělejte místo toho toto:

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 se správně sváže s příslušným typem.



  1. Symfony 3 - V ovladači došlo k výjimce:nelze najít ovladač

  2. Oracle Kombinujte několik sloupců do jednoho

  3. Je mít 'NEBO' ve stavu INNER JOIN špatný nápad?

  4. Jak vybrat pouze datum z pole DATETIME v MySQL?