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.