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 后创建或替换触发器 trigSales DECLARE 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 触发器练习的主要内容,如果未能解决你的问题,请参考以下文章

pl/sql基础练习

PL/SQL 触发器以防止插入

PL/SQL 触发器不会运行

PL/SQL - 触发器计数

带有动态 sql 的 PL/SQL 触发器

Oracle笔记4-pl/sql-分支/循环/游标/异常/存储/调用/触发器