Masz kilka różnych tabel z dokładnie takimi samymi nazwami kolumn i typami danych? Pachnie jak podejrzany projekt.
W każdym razie nie możemy używać zmiennych jako obiektów bazy danych w prostym SQL w ten sposób. Musimy użyć dynamicznego 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;
Jednym z powodów unikania używania dynamicznego SQL jest to, że jest on podatny na nadużycia. Złośliwi ludzie mogą użyć parametrów, aby spróbować ominąć nasze zabezpieczenia. Nazywa się to wstrzykiwaniem SQL. Myślę, że ludzie przeceniają znaczenie iniekcji SQL. To nie jest automatycznie zagrożenie. Na przykład, jeśli procedura jest prywatną procedurą w pakiecie (tzn. nie zadeklarowaną w specyfikacji), jest mało prawdopodobne, że ktoś ją przechwyci.
Ale rozsądne jest podjęcie środków ostrożności. DBMS_ASSERT to pakiet wprowadzony w Oracle 10g do przechwytywania prób ataków typu SQL injection. W takim przypadku warto by go użyć do sprawdzenia podanej nazwy tabeli
....
'UPDATE '|| DBMS_ASSERT.simple_sql_name(pADSLTable)
....
Uniemożliwiłoby to każdemu przekazywanie 'pay_table set salary = salary * 10 where id = 1234 --'
jako parametr nazwy tabeli.
Innym powodem unikania dynamicznego SQL jest to, że trudniej jest uzyskać poprawne i trudniejsze debugowanie. Składnia rzeczywistej instrukcji jest sprawdzana tylko w czasie wykonywania. Dobrze jest mieć pełny zestaw testów jednostkowych, które weryfikują wszystkie przekazane dane wejściowe, aby upewnić się, że procedura nie rzuca wyjątku składni.
Wreszcie, taki dynamiczny SQL nie pojawia się w widokach takich jak ALL_DEPENDENCIES. Utrudnia to przeprowadzenie analizy wpływu i zlokalizowanie wszystkich programów korzystających z danej tabeli lub kolumny.