sql >> Database >  >> RDS >> Oracle

Dynamische SQL-syntaxis met EXECUTE IMMEDIATE

WAARSCHUWING :Dynamische SQL zoals deze is gevoelig voor SQL Injection-aanvallen. Herschrijf waar mogelijk uw dynamische SQL om in plaats daarvan bindvariabelen te gebruiken.

In plaats van uw dynamische SQL als volgt te construeren:

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;

Gebruik dit:

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;

Dit is nog steeds onderhevig aan SQL-injectie op de l_prefix , maar als u die waarde programmatisch beheert, kan het in orde zijn. Door de constructie van de SQL en de uitvoering van de SQL in twee stappen te splitsen, kunt u de EXECUTE IMMEDIATE gemakkelijker vervangen met DBMS_OUTPUT.PUT_LINE(SQL); om uw zoekopdracht op syntaxisfouten te controleren. U kunt ook DBMS_OUTPUT.PUT_LINE uw parameters i.CUSTOMER_REF_ID en i.CUSTOMER_ID om hun waarden te controleren.




  1. hoe werken de groupby en count in sql

  2. Opgeslagen procedures versus triggers in MySQL

  3. Pad-arrays met NULL tot maximale lengte voor aangepaste aggregatiefunctie

  4. Eén record verwijderen uit Entity Framework?