У меня есть две таблицы, ПРОДУКТЫ и STATE_PRICE. Цены на каждый продукт зависят от штата. Таблица ПРОДУКТОВ отслеживает среднюю стоимость каждого продукта во всех штатах. Я пытаюсь написать триггер, который будет обновлять среднюю цену элемента в таблице ПРОДУКТОВ, когда цена будет вставлена, обновлена или удалена в таблице STATE_PRICE. Я написал следующий триггер, который компилируется, но когда я его тестирую, я получаю сообщение об ошибке. Я понимаю концепцию мутирующей ошибки, что я пытаюсь обновить таблицу, в которой выполняется триггер, но я фактически пытаюсь обновить таблицу ПРОДУКТОВ, пока триггер выполняется в таблице STATE_PRICE.Ошибка мутирования на триггер для вычисления средней стоимости
create or replace trigger trg_avg_cost
after insert or update or delete on state_price
for each row
declare
w_price state_price.list_price%type;
w_product state_price.productid%type;
begin
w_price := :new.list_price;
w_product := :new.productid;
update products
set avg_cost_per_unit = (select avg(w_price) from state_price
where productid = w_product);
end;
/
Конкретное сообщение об ошибке я получаю говорит: отчет
Ошибка:
SQL Error: ORA-04091: table STATE_PRICE is mutating, trigger/function may not see it
ORA-06512: at "TRG_AVG_COST", line 9
ORA-04088: error during execution of trigger 'TRG_AVG_COST'
04091. 00000 - "table %s.%s is mutating, trigger/function may not see it"
*Cause: A trigger (or a user defined plsql function that is referenced in
this statement) attempted to look at (or modify) a table that was
in the middle of being modified by the statement which fired it.
*Action: Rewrite the trigger (or function) so it does not read that table.
Я думаю, что вы должны использовать Pragma Autonomous_transaction в объявлении и снова проверить – ajmalmhd04