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.