Имате няколко различни таблици с абсолютно еднакви имена на колони и типове данни? Мирише на хитър дизайн.
Както и да е, не можем да използваме променливи като обекти на база данни в обикновен SQL като този. Трябва да използваме динамичен 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;
Една от причините да избягвате използването на динамичен SQL е, че той е отворен за злоупотреба. Злонамерените хора могат да използват параметрите, за да се опитат да заобиколят нашата сигурност. Това се нарича SQL инжекция. Мисля, че хората надценяват значението на SQL инжекцията. Това не е автоматично заплаха. Например, ако процедурата е частна процедура в пакет (т.е. не е декларирана в спецификацията), е малко вероятно някой да я отвлече.
Но е разумно да се вземат предпазни мерки. DBMS_ASSERT е пакет, въведен в Oracle 10g за улавяне на опити за SQL инжектиране на атаки. В този случай би си струвало да го използвате за валидиране на предаденото име на таблица
....
'UPDATE '|| DBMS_ASSERT.simple_sql_name(pADSLTable)
....
Това би попречило на всеки да премине 'pay_table set salary = salary * 10 where id = 1234 --'
като параметър на името на таблицата.
Друга причина да избягвате динамичния SQL е, че е по-трудно да се направи правилно и по-трудно да се отстранят грешки. Синтаксисът на действителния израз се проверява само по време на изпълнение. Добре е да имате пълен набор от модулни тестове, които валидират всички преминати входове, за да се гарантира, че процедурата няма да хвърля синтактично изключение.
И накрая, такъв динамичен SQL не се показва в изгледи като ALL_DEPENDENCIES. Това затруднява извършването на анализ на въздействието и намирането на всички програми, които използват дадена таблица или колона.