表格说明: 两张桌子 产品(Prodid,Prodesc,Price,Stock,Reord) 销售(Salesid,Proid,qty)
问题: 创建一个触发器,可以减少销售中插入的产品库存,并在购买时更新库存。
我只是为了购买而制作了样品触发器,但我的产品库存没有更新。 这是我的代码。
SQL> create or replace trigger updat after
2 insert or update on product for each row
3 declare
4 temp number;
5 temp1 number;
6 temp2 varchar2(5);
7 begin
8 select qty into temp from purchase;
9 select proid into temp2 from purchase;
10 select stock into temp1 from product;
11 temp1:=temp1+temp;
12 update product set stock=temp1 where prodid=temp2;
13 end;
14 /
我在触发器方面很弱。救命。
答案 0 :(得分:0)
这个触发器有点乱,所以很难知道从哪里开始。我会做出一些猜测和假设 - 我会试着把它们叫出来,但我可能会错过一两个。
首先,可能需要在sales
表上定义触发器。您希望修改product
表以响应对sales
表的更改。其次,该要求似乎只需要after insert
触发器,当product
中的行更新时,您似乎不需要修改sales
表。
CREATE OR REPLACE TRIGGER trigger_name
AFTER INSERT ON sales
FOR EACH ROW
其次,您的变量名称异常差。调用temp
,temp1
和temp2
这些内容会使您的代码更难以阅读和编写,因为您不知道实际包含的变量是什么。这使得阅读代码变得更加困难,看看发生了什么,更不用说发现任何错误了。总是选择有意义的名字。
第三,如果要编写select into
语句,则需要确保始终选择单行。这几乎肯定需要一个WHERE
子句,最有可能使用:new
伪记录中的一个或多个列来确定您感兴趣的行。但是,在这种情况下,似乎没有需要声明任何局部变量或编写任何select
语句。听起来你只想
UPDATE product
SET stock = stock - :new.qty
WHERE prodID = :new.prodID
如果您想要增强触发器以处理sales
的更新以及插入,您可能需要计算:old.qty
和:new.qty
之间的差异,并从中减去stock
的{{1}}。
答案 1 :(得分:-1)
我不确定你为什么要用prodid添加你的数量。表销售,产品和购买之间的关系尚不清楚。根据您的描述,我认为这会有所帮助。
create or replace trigger TRIG_STOCK
after insert or update on Sales
for each row
pragma autonomous_transaction;
begin
update product set stock=stock-:new.qty where prodid=:new.prodid;
update purchase set qty=:new.qty where prodid=:new.prodid;
commit;
end;