Oracle
 sql >> Database >  >> RDS >> Oracle

Sintassi SQL dinamica utilizzando EXECUTE IMMEDIATE

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.