Har du flera olika tabeller med exakt samma kolumnnamn och datatyper? Luktar som en tvivelaktig design.
Hur som helst, vi kan inte använda variabler som databasobjekt i enkla SQL som det. Vi måste använda dynamisk SQL.
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;
En anledning till att undvika användningen av dynamisk SQL är att den är öppen för missbruk. Skadliga personer kan använda parametrarna för att försöka kringgå vår säkerhet. Detta kallas SQL-injektion. Jag tror att folk överskattar betydelsen av SQL-injektion. Det är inte automatiskt ett hot. Om förfarandet till exempel är ett privat förfarande i ett paket (dvs. inte anges i specifikationen) är det osannolikt att någon kommer att kapa det.
Men det är klokt att vidta försiktighetsåtgärder. DBMS_ASSERT är ett paket som introduceras i Oracle 10g för att fånga försök till SQL-injektionsattacker. I detta fall skulle det vara värt att använda det för att validera det godkända tabellnamnet
....
'UPDATE '|| DBMS_ASSERT.simple_sql_name(pADSLTable)
....
Detta skulle förhindra att någon passerar 'pay_table set salary = salary * 10 where id = 1234 --'
som parameter för tabellnamn.
En annan anledning att undvika dynamisk SQL är att det är svårare att få rätt och svårare att felsöka. Syntaxen för den faktiska satsen kontrolleras endast vid körning. Det är bra att ha en komplett uppsättning enhetstester som validerar alla godkända indata, för att säkerställa att proceduren inte skapar ett syntaxundantag.
Slutligen, sådan dynamisk SQL visas inte i vyer som ALL_DEPENDENCIES. Detta gör det svårare att genomföra konsekvensanalyser och hitta alla program som använder en given tabell eller kolumn.