CẢNH BÁO :SQL động như thế này dễ bị tấn công SQL Injection. Bất cứ nơi nào có thể, hãy viết lại SQL động của bạn để sử dụng các biến liên kết thay thế.
Thay vì xây dựng SQL động của bạn như thế này:
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;
Sử dụng cái này:
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;
Điều này vẫn phải được đưa vào SQL tại l_prefix
, nhưng nếu bạn kiểm soát giá trị đó theo chương trình thì có thể OK. Ngoài ra, việc tách việc xây dựng SQL và thực thi SQL thành hai bước cho phép bạn dễ dàng thay thế EXECUTE IMMEDIATE
với DBMS_OUTPUT.PUT_LINE(SQL);
để kiểm tra truy vấn của bạn để tìm lỗi cú pháp. Bạn cũng có thể muốn DBMS_OUTPUT.PUT_LINE
thông số của bạn i.CUSTOMER_REF_ID
và i.CUSTOMER_ID
để kiểm tra giá trị của chúng.