UPOZORNĚNÍ :Dynamický SQL jako tento je náchylný k útokům SQL Injection. Kdykoli je to možné, přepište svůj dynamický SQL tak, aby místo toho používal proměnné vazby.
Namísto konstrukce dynamického SQL takto:
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;
Použijte toto:
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;
Toto je stále předmětem vkládání SQL v l_prefix
, ale pokud tuto hodnotu ovládáte programově, může to být v pořádku. Také rozdělení konstrukce SQL a provádění SQL do dvou kroků vám umožní snadněji nahradit příkaz EXECUTE IMMEDIATE
pomocí DBMS_OUTPUT.PUT_LINE(SQL);
pro kontrolu syntaktických chyb v dotazu. Můžete také chtít DBMS_OUTPUT.PUT_LINE
vaše parametry i.CUSTOMER_REF_ID
a i.CUSTOMER_ID
zkontrolovat jejich hodnoty.