Oracle
 sql >> Base de données >  >> RDS >> Oracle

Syntaxe SQL dynamique utilisant EXECUTE IMMEDIATE

AVERTISSEMENT :SQL dynamique comme celui-ci est sensible aux attaques par injection SQL. Dans la mesure du possible, réécrivez votre SQL dynamique pour utiliser des variables de liaison à la place.

Au lieu de construire votre SQL dynamique comme ceci :

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;

Utilisez ceci :

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;

Ceci est toujours soumis à l'injection SQL au l_prefix , mais si vous contrôlez cette valeur par programme, cela peut convenir. De plus, diviser la construction du SQL et l'exécution du SQL en deux étapes vous permet de remplacer plus facilement le EXECUTE IMMEDIATE avec DBMS_OUTPUT.PUT_LINE(SQL); pour vérifier votre requête pour les erreurs de syntaxe. Vous pouvez également vouloir DBMS_OUTPUT.PUT_LINE vos paramètres i.CUSTOMER_REF_ID et i.CUSTOMER_ID pour vérifier leurs valeurs.