OSTRZEŻENIE :Dynamiczny SQL taki jak ten jest podatny na ataki SQL Injection. Tam, gdzie to możliwe, przepisz swój dynamiczny kod SQL, aby zamiast tego używał zmiennych wiązania.
Zamiast konstruować dynamiczny SQL w ten sposób:
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;
Użyj tego:
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;
To nadal podlega wstrzyknięciu SQL pod l_prefix
, ale jeśli sterujesz tą wartością programowo, może być OK. Również podzielenie budowy i wykonania SQL na dwa kroki pozwala łatwiej zastąpić EXECUTE IMMEDIATE
z DBMS_OUTPUT.PUT_LINE(SQL);
aby sprawdzić zapytanie pod kątem błędów składniowych. Możesz także chcieć DBMS_OUTPUT.PUT_LINE
Twoje parametry i.CUSTOMER_REF_ID
oraz i.CUSTOMER_ID
aby sprawdzić ich wartości.