PERINGATAN :SQL Dinamis seperti ini rentan terhadap serangan SQL Injection. Jika memungkinkan, tulis ulang SQL dinamis Anda untuk menggunakan variabel bind.
Alih-alih membangun SQL dinamis Anda seperti ini:
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;
Gunakan ini:
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;
Ini masih tunduk pada injeksi SQL di l_prefix
, tetapi jika Anda mengontrol nilai itu secara terprogram, mungkin tidak masalah. Juga membagi konstruksi SQL dan eksekusi SQL menjadi dua langkah memungkinkan Anda untuk lebih mudah mengganti EXECUTE IMMEDIATE
dengan DBMS_OUTPUT.PUT_LINE(SQL);
untuk memeriksa kueri Anda untuk kesalahan sintaksis. Anda juga dapat ingin DBMS_OUTPUT.PUT_LINE
parameter Anda i.CUSTOMER_REF_ID
dan i.CUSTOMER_ID
untuk memeriksa nilainya.