Я пытался реализовать этот триггер на некоторое время и добился прогресса (я думаю!), Но теперь я получаю ошибку мутации.Триггер для расчета промежуточного итога
У меня есть три объекта (которые здесь актуальны), Customer_Order (всего и т. Д.), Order_Line (количество, промежуточный итог и т. Д.) И Продукты (акции, цена). Order_line - это объект связи, поэтому продукт может быть во многих order_lines, а customer_order может иметь много order_lines, но order_line может появляться только один раз в заказе и может содержать только один продукт. Цель триггера - взять промежуточный итог от order_line (или цены от продуктов, которые, как мне кажется, на самом деле), и количества из order_line, умножить их и обновить промежуточный итог новой order_line.
Поэтому я вставляю order_line с моим внешним ключом продукта, количеством 3 и ценой 4,00, триггер умножает два на равные 12 и обновляет промежуточный итог. Теперь я думаю, что правильно использовать цену здесь вместо промежуточного итога Order_line, чтобы исправить ошибку мутации (что происходит из-за того, что я прошу триггер обновить таблицу, к которой обращается оператор триггера, правильно?), Но как я могу исправить проблему с количеством? Количество не всегда будет тем же значением, что и акции, оно должно быть меньше или равно запасу, так что кто-нибудь знает, как я могу исправить это, чтобы выбрать из продукта и обновить order_line? Благодарю.
CREATE OR REPLACE TRIGGER create_subtotal
BEFORE INSERT OR UPDATE ON Order_Line
for each row
DECLARE
currentSubTotal order_line.subtotal%type;
currentQuantity order_line.quantity%type;
BEGIN
select order_line.subtotal,order_line.quantity
into currentSubTotal,currentQuantity
from order_line
where product_no = :new.product_no;
IF (currentquantity>-1) then
update order_line set subtotal= currentSubTotal * currentQuantity where line_no=:new.line_no;
END IF;
END;
.
run
EDIT: Я думаю, что я мог бы использовать: новый синтаксис для использования значения количества из триггера. Я попробую это, но я буду благодарен за подтверждение и помощь, спасибо.
+1 для текста. (Я не тестировал код. В своеобразный поворот к моим ранним дням в дизайне базы данных у меня есть только доступ к Oracle * дома *). –