триггер оракула после вставки или обновления позиции продажи - PullRequest
1 голос
/ 21 января 2010

У меня есть эта таблица, которая представляет слабую сущность и является типичной таблицей для представления упорядоченных элементов: вставьте в значения ITEM_FORNECIMENTO (a_orderId, a_prodId, a_prodQtd, a_buyPrice);

Я хочу, чтобы мой триггер обновил последнююстолбец (общая цена продуктов без iva), чтобы сделать это: totalPrice = totalPrice * (1+ (iva / 100), каждый раз, когда я вставляю или обновляю запись в этой таблице.

, поэтому я подошелс этим, но я совершенно не прав, когда дело доходит до работы с новыми и старыми значениями.

create or replace
trigger t_replaceTotal
after insert or update of id_prod,qtd_if,prec_total_if on item_fornecimento
for each row 

declare
iva produto.iva_prod%type;
idProd  produto.id_prod%type;
r_old item_fornecimento.prec_total_if%type:=null;
r_new item_fornecimento.prec_total_if%type:=null;

begin
  select iva_prod,id_prod into iva,idprod from produto p where p.id_prod = id_prod; 
  r_old:= :old.prec_total_if;
  r_new:= :new.prec_total_if;
  update item_fornecimento item set prec_total_if = r_old * (1+(iva/100)) where item.id_prod = idprod;
end;

Может кто-нибудь, пожалуйста, помогите переписать этот код? Я получаю ошибку: ORA-01422: точная выборкавозвращает больше запрошенного числа строк ORA-06512: в «FUSION.T_REPLACETOTAL», строка 8 ORA-04088: ошибка во время выполнения триггера «FUSION.T_REPLACETOTAL '

Ответы [ 2 ]

4 голосов
/ 21 января 2010

Проблема в том, что вы пытаетесь выбрать каждую строку из таблицы, потому что вы сопоставляете столбец (id_prod) с самим собой. Я подозреваю, что вы хотите использовать: new.id_prod или: old.id_prod.

select .... from produto p where p.id_prod = id_prod; 

Затем, сделайте это триггером BEFORE INSERT / UPDATE и замените инструкцию UPDATE на

 :new.prec_total_if := r_old * (1+(iva/100));

В противном случае вы получите беспорядок из-за ошибок мутирующих таблиц.

0 голосов
/ 21 января 2010

Эта ошибка говорит вам, что запрос, который сохраняет свой результат в переменную, возвращает более одного результата. Как таковой он не знает, что вы хотите сохранить в переменной.

Попробуйте выполнить следующее:

select iva_prod,id_prod from produto p where p.id_prod = id_prod;

и держу пари, это даст вам более одного результата, который нельзя сохранить в iva,idprod.

...