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.