sql >> Base de Datos >  >> RDS >> Oracle

Sintaxis SQL dinámica usando EXECUTE IMMEDIATE

ADVERTENCIA :SQL dinámico como este es susceptible a ataques de inyección SQL. Siempre que sea posible, reescriba su SQL dinámico para usar variables de vinculación en su lugar.

En lugar de construir su SQL dinámico de esta manera:

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 esto:

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;

Esto todavía está sujeto a la inyección SQL en el l_prefix , pero si controla ese valor programáticamente, puede estar bien. Además, dividir la construcción del SQL y la ejecución del SQL en dos pasos le permite reemplazar más fácilmente EXECUTE IMMEDIATE con DBMS_OUTPUT.PUT_LINE(SQL); para verificar su consulta en busca de errores de sintaxis. También puede desear DBMS_OUTPUT.PUT_LINE sus parámetros i.CUSTOMER_REF_ID y i.CUSTOMER_ID para comprobar sus valores.