【问题标题】:creating a trigger that updates a table when a column in a different table is updated创建在不同表中的列更新时更新表的触发器
【发布时间】:2023-03-23 21:47:01
【问题描述】:

由于某种原因,我很难完全理解触发器。对于我的家庭作业,我需要创建一个表,其中包含每个产品的产品 ID、总销售额和总销量(这些列已经在两个不同的表中)。然后我创建一个触发器,当来自不同表的 orderplaced 列更新为 1 时更新此表。不完全确定从哪里开始。由于我创建的表是空的,我会按照分配的建议做一个 UPDATE 表还是一个 INSERT 因为列是空的?如果有人能把我引向正确的方向,我将不胜感激..

CREATE TABLE bb_sales_sum (
    idProduct number(2) NOT NULL,
    total number(6,2),
    quantity number); 

CREATE OR REPLACE TRIGGER BB_SALESUM_TRG
    AFTER UPDATE OF orderplaced on bb_basket 
    FOR EACH ROW
    WHEN (NEW.orderplaced = 1)
DECLARE 
    lv_count Number;
BEGIN   
    if :new.orderplaced = 1 then 
        for item in 
            (select idproduct, (quantity * price) AS total, quantity
            from bb_basketitem
            where idbasket = :old.idbasket)
    loop
        select count(*)
        into lv_count
        from bb_sales_sum where idProduct = item.idproduct;

        if lv_count = NULL then
            INSERT INTO bb_sales_sum
            VALUES (item.idproduct, item.total, item.quantity);
        else
            update bb_sales_sum 
            set quantity = item.quantity where
            idProduct = item.idproduct;
        end if;
    end loop;
    end if;

END; 
/

【问题讨论】:

    标签: oracle plsql database-trigger


    【解决方案1】:

    您可以使用MERGE 代替更新,如果给定的idproduct 还没有新行,它将创建一个新行,并更新那些已经可用的行的数量和总数。

    CREATE OR REPLACE TRIGGER bb_salesum_trg
        AFTER UPDATE OF orderplaced on bb_basket 
          FOR EACH ROW
        WHEN (NEW.orderplaced = 1)
    
    BEGIN   
      MERGE INTO bb_sales_sum t USING 
      ( select :new.idproduct as idproduct ,
               :new.quantity  as quantity,
               :new.total     as total 
               from dual ) s  
         ON (s.idproduct = t.idproduct ) 
             WHEN MATCHED THEN UPDATE
                SET  quantity  = s.quantity,
                     total     = s.total
              WHEN NOT MATCHED THEN
         INSERT (
              idproduct,quantity,total)
         VALUES
              ( :new.idproduct,:new.quantity,:new.total );
    END;
    /
    

    DEMO

    【讨论】:

      【解决方案2】:

      基本上是这样的:

      您有一个记录单个订单的表。它可能有 Product Id、Quantity 和 Total 或类似的列。

      你把你的触发代码放在这张桌子上。

      当有人在此处插入新记录时,您将获取数量和/或总计并更新主产品表。您将新的数量和总计添加到产品 ID 匹配的主表中的现有汇总值中。

      【讨论】:

      • 我不确定我是否遵循。我相信触发器的第一部分是正确的,但我不确定在 BEGIN 下面放什么。我正在从两个不同的表中获取数据以插入到一个空表中。我该怎么做呢???我尝试过的一切都给了我一个错误。
      • “我所尝试的一切都给了我一个错误”没有提供可操作或诊断信息。没有人可以调试或纠正甚至评论他们看不到的代码。更新您的帖子以显示“出错”的完整触发器。只有这样人们才能开始纠正并指出正确的方向。
      猜你喜欢
      • 2023-03-17
      • 2015-07-25
      • 2012-04-13
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      相关资源
      最近更新 更多