sql >> Databasteknik >  >> RDS >> Oracle

Dynamisk SQL-syntax med EXECUTE IMMEDIATE

VARNING :Dynamisk SQL som denna är känslig för SQL Injection-attacker. Om möjligt, skriv om din dynamiska SQL för att använda bindningsvariabler istället.

Istället för att konstruera din dynamiska SQL så här:

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;

Använd detta:

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;

Detta är fortfarande föremål för SQL-injektion vid l_prefix , men om du styr det värdet programmässigt kan det vara OK. Genom att även dela upp konstruktionen av SQL och exekvering av SQL i två steg kan du lättare byta ut EXECUTE IMMEDIATE med DBMS_OUTPUT.PUT_LINE(SQL); för att kontrollera din fråga efter syntaxfel. Du kan också vilja DBMS_OUTPUT.PUT_LINE dina parametrar i.CUSTOMER_REF_ID och i.CUSTOMER_ID för att kontrollera deras värden.




  1. När ska man använda TEXT i mysql istället för VARCHAR

  2. Varför misslyckas anslutningen till min Postgres-server i Azure om min app inte har SSL aktiverat?

  3. Hur man beställer efter antal i SQL?

  4. Google App Engine och Cloud SQL:Förlorade anslutningen till MySQL-servern vid "läsning av initialt kommunikationspaket"