ПРЕДУПРЕЖДЕНИЕ :Динамичен SQL като този е податлив на атаки чрез SQL инжектиране. Където е възможно, пренапишете вашия динамичен SQL, за да използвате вместо него свързващи променливи.
Вместо да конструирате своя динамичен SQL по този начин:
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;
Използвайте това:
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;
Това все още подлежи на SQL инжектиране в l_prefix
, но ако контролирате тази стойност програмно, може да е ОК. Освен това разделянето на конструкцията на SQL и изпълнението на SQL на две стъпки ви позволява по-лесно да замените EXECUTE IMMEDIATE
с DBMS_OUTPUT.PUT_LINE(SQL);
за да проверите заявката си за синтактични грешки. Можете също да искате DBMS_OUTPUT.PUT_LINE
вашите параметри i.CUSTOMER_REF_ID
и i.CUSTOMER_ID
за да проверите техните стойности.