【问题标题】:Create Oracle Update Trigger创建 Oracle 更新触发器
【发布时间】:2019-05-03 16:19:51
【问题描述】:

大家好,第一次在 Stack Overflow 上提问。

所以我的问题如下:当A表插入一行时,需要计算奖励积分,并且必须将它们添加到表B中的赚取积分列中。我们还需要根据层级计算额外积分表 B 中的客户。表 B 有一个引用表 C 的 FK,其中包含我需要的属性,因此我的积分计算是正确的。

我设法编译了以下代码,它基本上链接了表 A 和 B,但我不知道如何从表 C 中获取我需要的值才能使其正确。

CREATE OR REPLACE TRIGGER JavierRewards
AFTER INSERT ON Purchases
FOR EACH ROW
BEGIN
    UPDATE customers
    SET customers.earned_points = customers.earned_points + Round(:New.purchase_amount * 1.5)
    WHERE customers.cust_id = :new.cust_id;
END;

有什么想法吗?第一次学习触发所以它有点令人沮丧。

【问题讨论】:

  • 一般说明:不要在触发器中做太多这种逻辑。最后,您可能需要在不触发这些触发器的情况下进行更改,并且您基本上会被隐藏在数据库中的大量业务逻辑所困,无法控制何时触发。如果您无法将其从数据库中取出,至少创建一个存储过程来存储购买并更新客户。我很难学到这一点。
  • 这是一个家庭作业,之后我必须做一些程序lol
  • 啊 ^.^ 这样的话没关系:)
  • 对此有什么建议吗?
  • 哦,我认为 Barbaros Özhan 正在回答您的问题。 :-) 你可以通过阅读this来支持他。

标签: sql oracle plsql insert-update database-trigger


【解决方案1】:

您可以使用以下带有额外选择语句的语句:

CREATE OR REPLACE TRIGGER JavierRewards
AFTER INSERT ON Purchases
FOR EACH ROW
    v_Extra_Amount TableC.Extra_Amount%type;
BEGIN
   BEGIN
      SELECT c.Extra_Amount 
        INTO v_Extra_Amount
        FROM TableC c 
        JOIN customers s on s.c_ID = c.ID
       WHERE s.cust_id = :new.cust_id;
     EXCEPTION WHEN no_data_found THEN v_Extra_Amount := 0;
   END;

    UPDATE customers s
       SET s.earned_points = s.earned_points + Round(:New.purchase_amount * 1.5) 
                            + (:New.Purchase_amount * v_Extra_Amount)
     WHERE s.cust_id = :new.cust_id;
END;

【讨论】:

  • 你好巴巴罗斯!表 C 有一个数字,基本上我想在计算中使用,但我不知道如何得到它。我需要一种方法来获得 c.earned_points = c.earned_points + Round(:New.purchase_amount * 1.5) + (:New.Purchase_amount * Extra Amount)。额外金额是表 C 中包含的值。
  • @JavierRuizVelez 嗨,哈维尔,我已经更新了,您正在寻找...吗?
  • 您好,Barbaros 澄清一下,因为我觉得我到处都在试图解释这一点:表 B 有一个名为 Tier_ID 的 FK,它引用了 Rewards_Tier(表 C)。表 C 有一个名为 Extra_Amount 的属性,我不知道如何获得。出于某种原因,你写给我的东西给了我一个错误。
  • Barbaros 非常感谢您解决了超过 12 小时的痛苦。非常感谢先生。
  • @JavierRuizVelez 亲爱的朋友,不客气。如果对您有帮助,请标记答案。
【解决方案2】:

您应该考虑将插入和更新操作都放在某个函数中,因为只有当它是最后一个选项时才应该使用触发器,恕我直言

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 2016-12-03
    • 2011-10-25
    • 2012-07-31
    • 2016-05-26
    • 2017-03-27
    • 2016-03-01
    相关资源
    最近更新 更多