PL/SQL 触发器练习
Posted
技术标签:
【中文标题】PL/SQL 触发器练习【英文标题】:PL/SQL Trigger exercise 【发布时间】:2018-04-13 05:27:16 【问题描述】:我有一个问题,我可以看到它在问什么,但就是想不通如何具体写它:
当一个新的元组被插入到销售订单明细中时,您的触发器应该在 Inventory Report 表中为报告日期插入一个相应的原材料元组(即,起始库存水平、消耗数量、当日订单数量、下一个- 天订单数量)
我从笔记中收集的假设:
itemID = RAWMATERIALS 表中的 itemID
reportDate = SALESORDERS 表中的到期日期
begInv = RAWMATERIALS 表中的inventoryLevels
consumpQty = 来自 FINISHEDGOODS 的 itemID * 来自 FINISHED GOODS 的 rmQuantity(制造每个成品所需的原材料)
orderNextDay = 如果 consumpQty
orderSameDay = If 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
然后我知道我们可能需要插入 INVENTORYREPORT 表(其中目前没有数据),并且可能执行 IF ELSEIF 语句来满足 orderNextDay 和 orderSameDay 列,但我仍然对 PL/不够熟悉SQL 知道如何解决这个问题。
谁能帮我解决这个问题?谢谢!
【问题讨论】:
【参考方案1】:我会尝试找一些时间为您编写一些代码,但我的第一个建议是不要在触发器中执行此操作。相反,创建一个插入到 SALESORDERDETAIL 中的过程“insert_so_detail”,然后将相关的插入到 INVENTORYREPORT 中。
然后总是调用该过程以插入到 S-O-D 表中。在触发器中执行 DML 是一件棘手的事情,因为数据库可能会决定它需要重新启动 DML,然后可能会再次插入 I-R 表。查看此AskTOM thread 了解更多详情。
你总是最好把你的 DML 放到 PL/SQL 包 API 中,然后只允许表上的 DML通过 API(授予对包执行,不授予插入或更新或删除直接放在桌子上给用户)。
【讨论】:
好的,非常感谢!不幸的是,这是一个我们必须用触发器来解决的练习。感谢您的帮助 我一直在使用它并拥有:在每行插入 SALESORDERDETAIL 后创建或替换触发器 trigSalesDECLARE temp_ItemID rawmaterials.itemid%type; reportDate salesorders.duedate%type; begInvLevel rawmaterials.inventorylevel%type; temp_rmquantity finishedgoods.rmquantity%type; BEGIN Insert into INVENTORYREPORT (ITEMID,REPORTDATE,BEGINNINGINVENTORYLEVEL,CONSUM PTIONQUANTITY,ORDERNEXTDAY,ORDERSAMEDAY) '', '', '');
/*:new.consumptionquantity := temp_rmquantity * temp_ItemID; IF consumptionquantity <= begInvLevel THEN orderNextDay := consumptionquantity; ELSE IF consumptionquantity > begInvLevel THEN orderNextDay := begInvLevel; ELSE orderSameDay := consumptionquantity - begInvLevel; END IF;*/ END; /
谁能给我一些见解?我正在尝试为一个我说我今天已经准备好的小组项目完成这个,但我仍然无法弄清楚。非常感谢!以上是关于PL/SQL 触发器练习的主要内容,如果未能解决你的问题,请参考以下文章