2012-03-09 3 views
3

Вопрос у меня есть, как я могу удалить запись на чтение? Я использую Oracle ond AIX с уровнем Roguewave DB в приложении C++.Oracle sql delete on read

Я искал в Google для этого ответа, но, кажется, только простые примеры. Есть ли инструкция SQL, которая возвращает удаленные строки?

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

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

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

ответ

5

В соответствии с oracle documentation действительно можно удалить и прочитать один раз:

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

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

+0

Я думаю, что это то, что мне нравится иметь синтаксис мудрый, он не работает в данный момент, но я постараюсь заставить его работать –

+0

Хороший ответ. Однако это будет работать только в хранимой процедуре, не так ли? Или вы можете использовать его непосредственно из, например, JDBC? – sleske

+0

@sleske: Я использовал предложение 'return' в операторах' select', используя OCCI без хранимых процедур, и он работал нормально. Поскольку это другой сценарий (другой слой db), я не могу быть уверенным. – nabulke

0

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

Good description to build an select trigger.

Создание:

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 
); 
+0

Как это поможет OP? Где строки удаляются? – sleske

+0

Я действительно не рассматривал триггеры как решение, я полагал, что триггер работает как вилка Select -> Data (fork trigger) -> возвращает данные в приложение, скажите, если мое понимание неверно –

+0

Изменяя вставить в удаление внутри вызываемой процедуры? Я должен признать, что я не пробовал, если можно изменить таблицу внутри функции без повторного запуска - так что, возможно, нужно добавить чек. – Eggi

1

Нет, нет SQL конструкт, чтобы читать и удалять строки в одном дыхании.

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

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