2015-08-11 8 views
0

Есть ли способ запрограммировать оракул после триггера обновления, чтобы вставить только самую последнюю запись в таблицу истории, когда выполняется массовое обновление.Oracle После запуска обновления для массового обновления

+0

Что вы имеете в виду только самое последнее - новое состояние всех обновленных строк? Что вы пробовали и что не работает, как вы этого хотите? –

+0

Предположим, что массовое обновление было выполнено, обновив запись, как в 10 раз. Если я запрограммирую триггер с «FOR EACH ROW», тогда для каждого обновления будут созданы 10 новых записей для того же ID. Я не хочу этого, я хочу знать, есть ли способ, по которому я могу получить только последнюю запись (в данном случае 10-я запись), которая будет иметь все обновленные значения для ранее обновленных 9 записей. –

+0

До сих пор я создал временную таблицу, в которую вставляются все обновленные записи. Впоследствии я нахожу дубликаты с использованием идентификаторов в этой таблице, упорядочиваю по записям в соответствии с их датой создания (по убыванию), а затем обновляю таблицу истории. Еще более надежный вариант я Ниже с помощью запроса SELECT * FROM (SELECT е. *, ROW_NUMBER() OVER (раздел по заказу root_id по history_creation_dte DESC) r--, статус ASC) г ОТ APP_TRANSACTION_R_TEMP е ) WHERE r = 1; –

ответ

1

Предположим, что вы опускаете пункт for each row. Чем вы можете добиться триггера оператора, который срабатывает только после совершения одной транзакции. Программное обеспечение может быть примерно таким:

create or replace trigger ai_test 
after insert on orders 

declare 

my_test_row orders%rowtype; 

begin 


select o.* 
into my_test_row 
from orders o 
where o.order_date = (select max(order_date) -- must be the identifying attribute 
         from orders); 


insert into orders_his (id, cust_id, prod_id, order_date) 
values 
(my_test_row.id 
, my_test_row.cust_id 
, my_test_row.prod_id 
, my_test_row.order_date);    


end; 
Смежные вопросы