AVVISO :SQL dinamico come questo è suscettibile agli attacchi di SQL injection. Ove possibile, riscrivi il tuo SQL dinamico per utilizzare invece le variabili di collegamento.
Invece di costruire il tuo SQL dinamico in questo modo:
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 questo:
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;
Questo è ancora soggetto a SQL injection in l_prefix
, ma se controlli quel valore in modo programmatico potrebbe essere OK. Inoltre suddividere la costruzione dell'SQL e l'esecuzione dell'SQL in due passaggi consente di sostituire più facilmente EXECUTE IMMEDIATE
con DBMS_OUTPUT.PUT_LINE(SQL);
per controllare la tua query per errori di sintassi. Puoi anche voler DBMS_OUTPUT.PUT_LINE
i tuoi parametri i.CUSTOMER_REF_ID
e i.CUSTOMER_ID
per verificarne i valori.