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.