关于触发器PL / SQL的另一个问题

时间:2011-04-05 03:15:24

标签: database oracle plsql

我遇到了关于以下内容的第二个触发器的问题:

我刚刚编写了一个存储过程和存储函数,用于在我的Orders表中插入一个新行。行更新插入:Ordernum,OrderDate,Customer,Rep,Manufacturer,Product,Qty和SaleAmount。

我现在必须编写一个触发器,通过添加新添加的销售额来更新我的办公室表。问题是,并非每个salesrep都有一个分配给他们的办公室。我不明白我是否需要在'FOR EACH ROW'下有一个when子句,以某种方式规定这个,或者如果我需要在我的SET Sales行之后规定。这是我的代码到目前为止,但不幸的是,它更新了所有办公室销售,而不仅仅是salesrep所属的那个:

CREATE OR REPLACE TRIGGER UpdateOffices
   AFTER INSERT ON Orders
   FOR EACH ROW
   BEGIN 
      UPDATE Offices
      SET Sales = Sales + :NEW.Amount
      WHERE Office IN (SELECT RepOffice
                       FROM Salesreps
                       WHERE RepOffice IS NOT NULL);
End;
/
SHOW ERRORS

Sales是Offices表上列的名称。如果存储过程中使用的名称,则为金额。

2 个答案:

答案 0 :(得分:3)

您已被建议在Salesreps上添加谓词,例如WHERE Salesrep = :NEW.Rep。为什么不将它添加到子查询中?

答案 1 :(得分:1)

使用此触发器方法,您将遇到实施解决方案的各种问题。

只要将订单修改提交到数据库,Office.Sales列值就会变为陈旧。例如,当订单上的价格或数量被更改或删除时。

我建议您将此要求实现为“提交时刷新”物化视图。