ADVARSEL :Dynamisk SQL som denne er modtagelig for SQL Injection-angreb. Hvor det er muligt, omskriv din dynamiske SQL for at bruge bindevariabler i stedet.
I stedet for at konstruere din dynamiske SQL sådan her:
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;
Brug denne:
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;
Dette er stadig underlagt SQL-injektion ved l_prefix
, men hvis du styrer denne værdi programmatisk, kan det være OK. Ved at dele konstruktionen af SQL'en og udførelsen af SQL'en i to trin kan du nemmere erstatte EXECUTE IMMEDIATE
med DBMS_OUTPUT.PUT_LINE(SQL);
for at kontrollere din forespørgsel for syntaksfejl. Du kan også ønske at DBMS_OUTPUT.PUT_LINE
dine parametre i.CUSTOMER_REF_ID
og i.CUSTOMER_ID
for at kontrollere deres værdier.