TRIGGERS-更新表中的值而不更新Oracle SQL

时间:2014-04-15 16:32:52

标签: sql oracle triggers

表格说明: 两张桌子 产品(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  /

我在触发器方面很弱。救命。

2 个答案:

答案 0 :(得分:0)

这个触发器有点乱,所以很难知道从哪里开始。我会做出一些猜测和假设 - 我会试着把它们叫出来,但我可能会错过一两个。

首先,可能需要在sales表上定义触发器。您希望修改product表以响应对sales表的更改。其次,该要求似乎只需要after insert触发器,当product中的行更新时,您似乎不需要修改sales表。

CREATE OR REPLACE TRIGGER trigger_name
  AFTER INSERT ON sales
  FOR EACH ROW

其次,您的变量名称异常差。调用temptemp1temp2这些内容会使您的代码更难以阅读和编写,因为您不知道实际包含的变量是什么。这使得阅读代码变得更加困难,看看发生了什么,更不用说发现任何错误了。总是选择有意义的名字。

第三,如果要编写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;