Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Sintaxe SQL dinâmica usando EXECUTE IMMEDIATE


AVISO :SQL dinâmico como este é suscetível a ataques de injeção de SQL. Sempre que possível, reescreva seu SQL dinâmico para usar variáveis ​​de ligação.

Em vez de construir seu SQL dinâmico assim:
L_SQL := 'UPDATE '||l_prefix||'CRS_CUSTOMERS SET CUSTOMER_SOURCE_REF_ID = '||i.CUSTOMER_REF_ID||' WHERE CUSTOMER_ID = '||i.CUSTOMER_ID;
EXECUTE IMMEDIATE L_SQL;

Usa isto:
L_SQL := 'UPDATE '||l_prefix||'CRS_CUSTOMERS SET CUSTOMER_SOURCE_REF_ID = :REF_ID WHERE CUSTOMER_ID = :CUST_ID';
EXECUTE IMMEDIATE L_SQL USING i.CUSTOMER_REF_ID, i.CUSTOMER_ID;

Isso ainda está sujeito à injeção de SQL no l_prefix , mas se você controlar esse valor programaticamente, pode ser OK. Também dividir a construção do SQL e a execução do SQL em duas etapas permite substituir mais facilmente o EXECUTE IMMEDIATE com DBMS_OUTPUT.PUT_LINE(SQL); para verificar sua consulta quanto a erros de sintaxe. Você também pode querer DBMS_OUTPUT.PUT_LINE seus parâmetros i.CUSTOMER_REF_ID e i.CUSTOMER_ID para verificar seus valores.