Удалить строку из таблицы Oracle, передав имя таблицы и имя столбца - PullRequest
1 голос
/ 19 сентября 2011

У меня есть страница JSP, где пользователь выбирает имя таблицы, имя столбца и значение столбца, с этими тремя условиями я хочу удалить все соответствующие строки из базы данных. Есть ли способ передать имя таблицы, имя столбца и значение столбца в Oracle, чтобы удалить определенную строку из таблицы? Любой пример поможет мне .. Спасибо

Ответы [ 3 ]

2 голосов
/ 19 сентября 2011

Я бы беспокоился об атаках 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>);
1 голос
/ 19 сентября 2011
DELETE FROM table_name WHERE column_name = column_value

Проблема в том, что вы не можете связать имена таблиц или столбцов в PreparedStatement, только значения столбцов.

0 голосов
/ 19 сентября 2011

Это должно работать (из памяти; не проверено):

Statement stmt = null;

try
{
    stmt = conn.createStatement("DELETE FROM " + tableName + " WHERE " + columnName + " = '" + condition + "'");
    int deleted = stmt.execute();
}
catch (SQLException e)
{
    ... report error
}

try
{
    if (stmt != null)
        stmt.close();
}
catch (SQLException ignore)
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...