Oracle sql удалить на чтение - PullRequest
3 голосов
/ 09 марта 2012

У меня вопрос, как я могу удалить запись при чтении? Я использую Oracle ond AIX с Roguewave DB Layer в приложении c ++.

Я искал в Google этот ответ, но, похоже, есть только простые примеры. Существует ли оператор SQL, который возвращает удаленные строки?

Это значительно повысит производительность моего приложения, поскольку только 0,1% случаев будет нуждаться в том, чтобы оставаться в этой таблице, другими словами, я вставлю 0,1% обратно в таблицу.

Единственный совет, который я нашел, - это предложение "Into", я бы предположил, что использование delete into сделает эту работу, но я никогда ее не использовал.

http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/returninginto_clause.htm

Ответы [ 3 ]

5 голосов
/ 09 марта 2012

Согласно документации оракула действительно возможно удалить и прочитать за один раз:

DELETE FROM employees
   WHERE job_id = 'SA_REP' 
   AND hire_date + TO_YMINTERVAL('01-00') < SYSDATE 
   RETURNING salary INTO :bnd1;

Я никогда не использовал это сам ... но вы могли бы попробовать

1 голос
/ 09 марта 2012

Нет, нет конструкции SQL для чтения и удаления строки за один раз.

Вы можете написать хранимую процедуру, которая делает это, хотя. Или вы можете кэшировать записи, которые вы уже прочитали в памяти (чтобы вы больше не читали их), а затем выполнить массовое удаление (DELETE FROM table WHERE id in (?)). Это должно быть быстрее, чем многие одиночные DELETE.

Или вы могли бы рассмотреть другой подход к проблеме. Зачем вам нужно удалять столько строк при их чтении? Вы используете таблицу БД для передачи сообщений? Может быть, есть другая технология, которая больше подходит для вашей проблемы? Если вы чувствуете, что должны работать против установленных соглашений технологии, это может указывать на то, что вы не используете правильный инструмент для работы ...

0 голосов
/ 09 марта 2012

Вы пробовали что-то вроде создания триггера аудита?

Хорошее описание для создания триггера выбора.

Создание:

begin
  dbms_fga.add_policy
  ( object_schema=>'SCOTT'
  , object_name=>'EMP'
  , policy_name=>'SAL_ACCESS_HANDLED'
  , audit_column => 'SAL'
  , audit_condition => 'SAL>= 1500'
  , handler_schema => 'SCOTT'
  , handler_module => 'AUDIT_HANDLER.HANDLE_EMP_SAL_ACCESS'
  );
end;
/

Подпись функции:

PROCEDURE HANDLE_EMP_SAL_ACCESS
( object_schema VARCHAR2
, object_name VARCHAR2
, policy_name VARCHAR2
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...