Я бы беспокоился об атаках SQL-инъекций, когда вы предоставляете имена таблиц и столбцов.
Вы можете создать функцию Oracle для удаления необходимых записей и проверки определенных условий перед удалением строки:
CREATE OR REPLACE
FUNCTION delete_record (
p_table IN VARCHAR2,
p_column IN VARCHAR2,
p_value IN VARCHAR2
)
RETURN NUMBER
AS
v_table user_tables.table_name%TYPE;
v_columns user_tab_cols.column_name%TYPE;
BEGIN
-- Check table exists in DB
SELECT table_name
INTO v_table
FROM user_tables
WHERE table_name = UPPER(p_table);
-- Check column exists in DB table
SELECT column_name
INTO v_colums
FROM user_tab_cols
WHERE table_name = UPPER(p_table)
AND column_name = UPPER(p_column);
EXECUTE IMMEDIATE
'DELETE FROM '||DBMS_ASSERT.SIMPLE_SQL_NAME(p_table)||
' WHERE '||DBMS_ASSERT.SIMPLE_SQL_NAME(p_column)||' = :col_value'
USING p_value;
RETURN SQL%ROWCOUNT;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
-- Either return -1 (error) or log an error etc.
RETURN -1;
WHEN others
THEN
<Your exception handling here>
END delete_record;
/
Это (или что-то в этом роде) проверило бы, что представленные переменные таблицы и столбца существуют в базе данных, прежде чем удалять записи и возвращать количество удаленных записей.
Если есть проблема с удаленным номером, вы можете выполнить оператор отката, если все в порядке, вы можете выполнить фиксацию.
Конечно, если вы хотите указать полное имя таблицы (рекомендуется), вы должны использовать функцию DBMS_ASSERT.QUALIFIED_SQL_NAME вместо функции DBMS_ASSERT.SIMPLE_SQL_NAME.
Надеюсь, это поможет ...
РЕДАКТИРОВАТЬ: В ответ на вопрос Джека о добавлении даты от и даты к.
Если вы добавите два новых условия, которые передаются в функцию как:
CREATE OR REPLACE
FUNCTION delete_record (
p_table IN VARCHAR2,
p_column IN VARCHAR2,
p_value IN VARCHAR2,
p_date_from IN DATE,
p_date_to IN DATE
)
Тогда вам нужно расширить EXECUTE IMMEDIATE:
EXECUTE IMMEDIATE
'DELETE FROM '||DBMS_ASSERT.SIMPLE_SQL_NAME(p_table)||
' WHERE '||DBMS_ASSERT.SIMPLE_SQL_NAME(p_column)||' = :col_value'||
' AND date BETWEEN :date_from AND :date_to'
USING p_value,
p_date_from,
p_date_to;
N.B. Это предполагает, что ваш столбец даты в таблице называется «дата».
В данный момент у меня нет интерфейса SQL, но он должен быть достаточно близок к тому, что вам нужно, чтобы он работал.
Если вы передаете параметры p_date_XXXX как VARCHAR2, а не как типы DATE, вам необходимо «TO_DATE» значения перед передачей их в динамический SQL.
, например
EXECUTE IMMEDIATE
'DELETE FROM '||DBMS_ASSERT.SIMPLE_SQL_NAME(p_table)||
' WHERE '||DBMS_ASSERT.SIMPLE_SQL_NAME(p_column)||' = :col_value'||
' AND date BETWEEN :date_from AND :date_to'
USING p_value,
TO_DATE(p_date_from, <date_format>),
TO_DATE(p_date_to, <date_format>);