Anda memiliki beberapa tabel berbeda dengan nama kolom dan tipe data yang persis sama? Baunya seperti desain yang cerdik.
Bagaimanapun, kita tidak bisa menggunakan variabel sebagai objek database dalam SQL langsung seperti itu. Kita harus menggunakan SQL dinamis.
PROCEDURE P_CUSTOMER_UPDATE
(
pADSLTable IN USER_TABLES.table_name%type,
pAccountname IN NVARCHAR2,
pStatus IN NUMBER,
pNote IN NVARCHAR2,
pEmail IN NVARCHAR2,
pMobi IN NVARCHAR2,
pServiceTypeID IN NUMBER,
pDate IN DATE
)
IS
BEGIN
execute immediate
'UPDATE '||pADSLTable
||' SET STATUS = :1, NOTE = :2, EMAIL = :3, MOBI = :4, SERVICETYPE_ID = :5, ACTIVATION_DATE = :6'
||' WHERE ACCOUNT_NAME = :7'
using pStatus, pNote, pEmail, pMobi, pServiceTypeID, pDate, pAccountname;
END;
Salah satu alasan untuk menghindari penggunaan SQL dinamis adalah karena terbuka untuk disalahgunakan. Orang jahat dapat menggunakan parameter untuk mencoba melewati keamanan kami. Ini disebut injeksi SQL. Saya pikir orang terlalu memperkirakan pentingnya injeksi SQL. Itu tidak otomatis menjadi ancaman. Misalnya jika prosedur adalah prosedur pribadi dalam sebuah paket (yaitu tidak dideklarasikan dalam spesifikasi), tidak mungkin ada orang yang akan membajaknya.
Tapi masuk akal untuk mengambil tindakan pencegahan. DBMS_ASSERT adalah paket yang diperkenalkan di Oracle 10g untuk menjebak percobaan serangan injeksi SQL. Dalam hal ini, akan bermanfaat menggunakannya untuk memvalidasi nama tabel yang diteruskan
....
'UPDATE '|| DBMS_ASSERT.simple_sql_name(pADSLTable)
....
Ini akan mencegah siapa pun melewati 'pay_table set salary = salary * 10 where id = 1234 --'
sebagai parameter nama tabel.
Alasan lain untuk menghindari SQL dinamis adalah lebih sulit untuk mendapatkan yang benar dan lebih sulit untuk di-debug. Sintaks dari pernyataan aktual hanya diperiksa pada saat run time. Sebaiknya memiliki rangkaian unit test lengkap yang memvalidasi semua input yang diteruskan, untuk memastikan bahwa prosedur tidak menimbulkan pengecualian sintaks.
Terakhir, SQL dinamis seperti itu tidak muncul dalam tampilan seperti ALL_DEPENDENCIES. Hal ini membuat lebih sulit untuk melakukan analisis dampak dan menemukan semua program yang menggunakan tabel atau kolom tertentu.