2014-01-21 3 views
0

Я пытаюсь создать триггер, который будет выполняться, когда элементы вводятся в таблицу заказов количество в таблице продуктов, предполагают, чтобы уменьшитьКак создать триггер обновления

create or replace trigger quantity_dicr after update of quantity on products for each row 
declare 
    quantity float; 
    begin 
     select quantity into quantity from products where o_id = :new.o_id; 
     set quantity = quantity + :new.quantity , 
     where o_id= :new.o_id; 
    end quantity_dicr; 

столы

create table products(
prod_id numeric not null, 
prod_name varchar2(50) not null, 
quantity numeric not null, 
price numeric not null, 
constraint prod_id_pk primary key(prod_id) 
) 
create table orders 
(
prod_id numeric not null, 
o_id numeric not null, 
quantity numeric not null, 
o_sum numeric not null, 
constraint fk_products foreign key (prod_id) references products(prod_id), 
constraint orders_pk primary key (o_id)) 
) 

это дает мне эти ошибки

Error(4,64): PLS-00049: bad bind variable 'NEW.O_ID' 
Error(5,7): PL/SQL: SQL Statement ignored 
Error(5,11): PL/SQL: ORA-00922: missing or invalid option 
Error(6,19): PLS-00049: bad bind variable 'NEW.O_ID' 

любую помощь, которая может оттенок света, почему у меня возникают эти ошибки будут б помощь полный

+0

В таблицах нет поля O_ID –

ответ

0

Я думаю, что она должна быть такой:

create or replace trigger quantity_dicr 
    after update of quantity on orders 
    for each row 

Trigger должен быть определен на столе заказов вместо таблицы продуктов.

BTW, что произойдет, если новый заказ размещен (то есть INSERT в заказы). Я полагаю, это также должно обновить количество продукта.

+0

да триггер должен обновлять обе таблицы, уменьшать количество на продукцию –

0

Ваша ошибка здесь

create or replace trigger quantity_dicr after update of quantity on products for each row 
declare 
    quantity float; 
begin 
    select quantity into quantity from products where o_id = :new.o_id; 
    set quantity = quantity + :new.quantity , 
    where o_id= :new.o_id; --Don't have field O_ID in table products 
end quantity_dicr; 

Вы можете сделать этот путь.

CREATE OR REPLACE TRIGGER quantity_dicr AFTER UPDATE ON orders FOR EACH ROW 
    UPDATE products SET quantity = quantity - :NEW.quantity WHERE prod_id = :NEW.prod_id; 
END quantity_dicr; 

Прочитайте это question или official documentation для получения дополнительной информации.

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