Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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 SQL触发器_Sql_Oracle_Triggers - Fatal编程技术网

oracle SQL触发器

oracle SQL触发器,sql,oracle,triggers,Sql,Oracle,Triggers,我应该写一个触发器来更新我的一个表中的属性。更具体地说: 我有一个属性为orderID、customerID、date、value的orders表,还有一个属性为orderID、articleID、quantity的OrderItems表。 订单中的价值是订单的组合价值,即每个订单项目的价格*数量之和。 现在,每当我按顺序更新、插入或删除任何项目时,触发器都应该保持属性值的更新。 插入和删除的触发器主体如下所示: IF INSERTING THEN UPDATE Orders SET v

我应该写一个触发器来更新我的一个表中的属性。更具体地说: 我有一个属性为orderID、customerID、date、value的orders表,还有一个属性为orderID、articleID、quantity的OrderItems表。 订单中的价值是订单的组合价值,即每个订单项目的价格*数量之和。 现在,每当我按顺序更新、插入或删除任何项目时,触发器都应该保持属性值的更新。 插入和删除的触发器主体如下所示:

IF INSERTING THEN
  UPDATE Orders
  SET value = value + (SELECT (:NEW.quantity* articles.price)
                           FROM articles
                           WHERE articles.articleID = :NEW.articleID)
  WHERE Orders.OrderID= :NEW.OrderID;
END IF;

IF DELETING THEN
  UPDATE Orders
  SET value = value - (SELECT (:OLD.quantity * articles.price)
                           FROM articles
                           WHERE articles.articleID = :OLD.articleID)
  WHERE Orders.OrderID= :OLD.OrderID;
END IF;
if inserting or deleting or updating then 

  if :NEW.quantity = :OLD.quantity and :NEW.article_id = :OLD.article_id then

    null;

  else

    update orders set
      value = value + 
        coalesce((
          SELECT (:NEW.quantity * articles.price) 
          FROM articles         
          WHERE articles.articleID = :NEW.articleID), 0) -
        coalesce((
          SELECT (:OLD.quantity * articles.price) 
          FROM articles         
          WHERE articles.articleID = :OLD.articleID), 0)
    where order_id = coalesce(:NEW.order_id, :OLD.order_id);

  end if;
end if;

现在我们还有更新案例。这就是我的问题所在:当插入一个新的订单项目时,价值当然会增加,所以我可以像上面那样将新的价值添加到旧的订单项目上。删除也一样:我可以减去已删除行的值。但是对于update来说,它变得很棘手:取决于update语句是增加还是减少数量,更改商品ID意味着价格增加或减少,或者两者都做,值将增加或减少。到目前为止,我的方法是使用许多不同的IF子句来处理IF:OLD.quantity<:NEW.quantity then,但这不是正确的方法。有人有想法吗?

我想你可以用以下三种逻辑来代替这三种逻辑:

  UPDATE Orders
      SET value = value + (SELECT (coalesce(:NEW.quantity, 0) - coalesce(:OLD.quantity, 0)) * a.price
                           FROM articles a
                           WHERE a.articleID = :NEW.articleID
                          )
      WHERE Orders.OrderID= :NEW.OrderID;

请注意,您假设价格尚未更新。如果可能的话,最好重新计算整个订单价格。

正确的想法是计算新旧差异。大概是这样的:

IF INSERTING THEN
  UPDATE Orders
  SET value = value + (SELECT (:NEW.quantity* articles.price)
                           FROM articles
                           WHERE articles.articleID = :NEW.articleID)
  WHERE Orders.OrderID= :NEW.OrderID;
END IF;

IF DELETING THEN
  UPDATE Orders
  SET value = value - (SELECT (:OLD.quantity * articles.price)
                           FROM articles
                           WHERE articles.articleID = :OLD.articleID)
  WHERE Orders.OrderID= :OLD.OrderID;
END IF;
if inserting or deleting or updating then 

  if :NEW.quantity = :OLD.quantity and :NEW.article_id = :OLD.article_id then

    null;

  else

    update orders set
      value = value + 
        coalesce((
          SELECT (:NEW.quantity * articles.price) 
          FROM articles         
          WHERE articles.articleID = :NEW.articleID), 0) -
        coalesce((
          SELECT (:OLD.quantity * articles.price) 
          FROM articles         
          WHERE articles.articleID = :OLD.articleID), 0)
    where order_id = coalesce(:NEW.order_id, :OLD.order_id);

  end if;
end if;

如果我这样做,它会对行更新顺序显示SQL语句被忽略,对下面的行显示关键字FROM not found where expected这看起来不错,谢谢。但是如果我想改变商品而不是改变数量呢?没关系。它起作用了,我没有正确阅读。非常感谢你!