Основная проблема заключается в том, что функции get_data__order_quantity
и get_data_cod_prod
, которые вызываются из вашего триггера, обращаются к таблице, для которой определен триггер. Это приведет к исключению мутирующей таблицы.
Другая проблема, конечно, в том, что ваши функции, скорее всего, не будут выполнять то, что вы намеревались. Вы говорите: «У меня есть ВЫПОЛНЕННЫЕ ФУНКЦИИ, ПОЛУЧАЮЩИЕ ПРОДУКТА_ID И ЗАКАЗАННОЙ СУММЫ ПОСЛЕДНЕЙ ЗАПИСИ, ВСТАВЛЕННОЙ В ТАБЛИЦУ ORDER_ITEMS», но ваши критерии выбора ...WHERE ROWNUM = 1
. Невозможно заранее узнать, какой будет эта запись - при отсутствии конкретных критериев выбора или упорядочения база данных может свободно возвращать строки в любом порядке, в котором она заинтересована. может возвращать последнюю вставленную строку, но может возвращать любую произвольную строку из таблицы. Вы просто не можете знать, основываясь на ROWNUM = 1, что вы вставите последнюю строку в таблицу.
К счастью, вам не нужно ничего этого делать, поскольку у вас уже есть доступ к строке, которая была только что вставлена через псевдоряд :NEW
. Я предлагаю переписать ваш триггер как:
create or replace trigger actualizar_stock
after insert on ORDER_ITEMS
for each row
begin
--UPDATE (REST THE CURRENT VALUE WITH THE ORDERED AMOUNT)
update inventories
set quantity_on_hand = quantity_on_hand - :NEW.QUANTITY
where QUANTITY_ON_HAND > 0 AND
product_id = :NEW.PRODUCT_ID;
IF SQL%ROWCOUNT = 0 THEN
-- No rows updated
dbms_output.put_line('Registration not updated');
end if;
end actualizar_stock;
Удачи.