PL / SQL触发器练习

时间:2018-04-13 05:27:17

标签: plsql triggers

我有这个问题,我可以看到它在问什么,但是我不知道如何专门写它:

当新的元组插入到销售订单明细中时,您的触发器应在报告日期的库存报告表中插入相应的原材料元组(即,开始库存水平,消耗量,当天订单数量,下一个日订单数量)

我从笔记中收集的假设:

itemID =来自RAWMATERIALS表的itemID

来自SALESORDERS表的reportDate = dueDate

来自RAWMATERIALS表的begInv = inventoryLevels

consumpQty = FINISHEDGOODS中的itemID * rmQuantity(每件成品所需的原材料)来自成品商品

orderNextDay =如果consumpQty< = begInv则orderNextDay = consumpQty                         orderSameDay = 0

orderSameDay =如果consumpQty> begInv然后orderNextDay = begInv                         orderSameDay = consumpQty - begInv

我认为触发器可能类似于:

CREATE OR REPLACE TRIGGER inv_report
BEFORE INSERT
ON SALESORDERDETAIL
FOR EACH ROW

DECLARE  
item_id RAWMATERIALS.ITEMID%TYPE
reportDate SALESORDERS.DUEDATE%TYPE
begInv RAWMATERIALS.INVENTORYLEVEL%TYPE

然后我明白我们可能需要INSERT到INVENTORYREPORT表(当前没有数据)并且可能做一个IF ELSEIF语句来满足orderNextDay和orderSameDay列,但我还是不熟悉PL / SQL确切地知道如何解决这个问题。

任何人都可以帮我解决这个问题吗?谢谢!

1 个答案:

答案 0 :(得分:0)

我会试着找一些时间为你写一些代码,但我的第一个建议是不要在触发器中执行此操作。而是创建一个插入SALESORDERDETAIL的过程“insert_so_detail”,然后将相关的插入执行到INVENTORYREPORT。

然后始终调用该过程以插入S-O-D表。在触发器内执行DML是一件棘手的事情,因为数据库可能决定需要重新启动DML,然后可能再次插入I-R表。有关详细信息,请查看此AskTOM thread

最好将DML放入PL / SQL包API,然后只允许表通过 API的DML(授予包执行,不授予插入或更新或删除在桌子上直接给用户)。