Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 创建一个触发器,在更新其他表中的列时更新表_Oracle_Plsql_Database Trigger - Fatal编程技术网

Oracle 创建一个触发器,在更新其他表中的列时更新表

Oracle 创建一个触发器,在更新其他表中的列时更新表,oracle,plsql,database-trigger,Oracle,Plsql,Database Trigger,出于某种原因,我很难完全理解触发器。对于我的家庭作业,我需要创建一个表,其中包含产品id、总销售额和每个产品的总销售量(这些列已经在两个不同的表中)。然后,我创建一个触发器,当来自不同表的orderplaced列更新为1时,该触发器将更新该表。不确定从哪里开始。由于我创建的表是空的,我会按照分配的建议更新表还是因为列是空的而插入?如果有人能给我指出正确的方向,我将非常感激 CREATE TABLE bb_sales_sum ( idProduct number(2) NOT NULL,

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

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; 
/

基本上是这样的:

您有一个记录单个订单的表。它可能有产品Id、数量和总计或类似列

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


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

您可以使用
合并来代替更新,如果给定的
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;
/

我不确定我是否听懂了。我相信触发器的第一部分是正确的,但我不确定下面该放什么。我从两个不同的表中获取数据以插入到一个空表中。我该怎么做???我试过的每件事都给了我一个错误。“我试过的每件事都给了我一个错误”没有提供可操作或诊断信息。没有人可以调试、更正甚至注释他们看不到的代码。更新您的帖子以显示“给出错误”的完整触发器。只有这样,人们才能开始纠正错误,为你指明正确的方向。