Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Dynamische SQL-Syntax mit EXECUTE IMMEDIATE

WARNUNG :Dynamisches SQL wie dieses ist anfällig für SQL-Injection-Angriffe. Wo immer möglich, schreiben Sie Ihr dynamisches SQL neu, um stattdessen Bindevariablen zu verwenden.

Anstatt Ihr dynamisches SQL wie folgt aufzubauen:

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;

Verwenden Sie dies:

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;

Dies unterliegt immer noch der SQL-Einschleusung bei l_prefix , aber wenn Sie diesen Wert programmatisch steuern, ist er möglicherweise in Ordnung. Auch die Aufteilung der Konstruktion des SQL und der Ausführung des SQL in zwei Schritte ermöglicht es Ihnen, EXECUTE IMMEDIATE einfacher zu ersetzen mit DBMS_OUTPUT.PUT_LINE(SQL); um Ihre Abfrage auf Syntaxfehler zu überprüfen. Sie können auch DBMS_OUTPUT.PUT_LINE verwenden Ihre Parameter i.CUSTOMER_REF_ID und i.CUSTOMER_ID um ihre Werte zu überprüfen.