在 Oracle 上检查产品成本的程序

Procedure to check the cost for product on Oracle

我有一个关于 Oracle 程序的问题,希望你们帮助 me.I 有这 3 个 table:

成分: Ingredient_Number PK Ingredient_Name, Quantity_On_Hand, Reorder_Point, Current_Cost,

Menu_Item
Menu_Item_号码PK Menu_Item_姓名, Current_Price, Production_Cost,

Menu_Item_成分
Menu_Item_个数PK/FK, Ingredient_NumberPK/FK, Quantity_Needed,

我尝试创建程序以在 Menu_Item table 上更新 Production_Cost if Production_Cost < Quantity_Needed * Current_cost* 0.75我最终得到了这些代码:

Create or Replace Procedure PR_Check_Cost
(P_Menu_Item_Number Number, P_Ingredient Number)
authid current_user 
IS
V_Productiton_Cost Number (6,2);
V_Current_Cost
V_Quantity_Needed Number (5,2);

CURSOR C_Cost 
IS
Select Production_Cost
INTO V_Production_Cost
From Menu_Item
Where Menu_Item_Number= P_Menu_Item_Number; 


Begin
Open C_Cost;

Select Quantity_Needed
Into V_Quantity_Needed
FROM Menu_Item_Ingredient
WHERE Ingredient_Number = P_Ingredient_Number
AND Menu_Item_Number = P_Menu_Item_Number;

Select Current_Cost
INTO V_CurrentCost
From Ingredient
Where Ingredient_Number = P_Ingredient_Number;

Fetch C_Product_Cost INTO V_Current_Cost, V_Quantity_Needed
While C_Product_Cost%FOUND LOOP


If (V_Quantity_Needed * V_Current_Cost * 0.75) > V_Production_Cost
{
    UPDATE Menu_Item
    SET Production_Cost = V_Quantity_Needed * V_Current_Cost * 0.75
    Where Menu_Item_Number = P_Menu_Item_Number
    AND Ingredient-Number = P_Ingredient_Number; 
}


End PR_Check_Cost;/
SHOW ERRORS;    

是否可以更改我的程序以在用户更新 Current_Cost 和 Quantity_Needed 列而不输入 的输入数据时自动检查和更新 Production_Cost Menu_Item_Number(PK) 和 Ingredient_Number(PK)

这是一个解决方案,它只会查询您需要更新的内容,然后使用批量更新它们。作为额外的奖励,它会表现得很好。

CREATE OR REPLACE update_pr_costs
AS
DECLARE

    menu_item_tab IS TABLE OF ROWTYPE%MENU_ITEM
        INDEX BY PLS_INTEGER;

    menu_items menu_item_tab;

Begin

Select
    mi.Menu_Item_Number,
    mi.Menu_Item_Name,
    mi.Current_Price,
    (mii.Quantity_Needed * ig.Current_Cost * 0.75) Production_Cost
BULK COLLECT INTO menu_items
FROM Menu_Item_Ingredient mii
JOIN Ingredient ig
ON mii.Ingredient_Number = ig.Ingredient_Number
LEFT JOIN Menu_Item mi
ON mi.Ingredient_Number = ig.Ingredient_Number
AND mii.Menu_Item_Number = mi.Menu_Item_Number
WHERE (ig.Current_Cost * mii.Quantity_Needed * 0.75) > mi.Production_Cost;

FORALL i in menu_items.FIRST .. menu_items.LAST
    UPDATE Menu_Item
    SET Production_Cost = menu_items(i).Production_Cost
    where Menu_Item_Number = menu_items(i).Menu_Item_Number
    AND Ingredient_Number = menu_items(i).Ingredient_Number; 


End PR_Check_Cost;/
SHOW ERRORS;

可用于启动程序的触发器。

CREATE OR REPLACE TRIGGER ingredient_after_update
AFTER UPDATE
   ON Ingredient
BEGIN
   update_pr_costs;
END;

CREATE OR REPLACE TRIGGER menu_item_ing_after_update
AFTER UPDATE
   ON Menu_Item_Ingredient
BEGIN
   update_pr_costs;
END;