Oracle SQL触发器帮助(销售项目,更改库存)

时间:2016-03-16 20:51:23

标签: oracle plsql database-trigger

尝试制作一个从库存中取走(销售)商品的触发器。当我进入:

INSERT INTO LINE VALUES (10, ‘C’, ‘Espresso’, 5, 10.00);

以下是我尝试触发的方法:

CREATE OR REPLACE TRIGGER TRG_UPDATE_INVENTORY
AFTER INSERT ON ____ FOR EACH ROW 
BEGIN   
UPDATE BB_PRODUCT   
SET STOCK = STOCK - :NEW._______
WHERE BB_PRODUCT.IDPRODUCT = :NEW.IDPRODUCT;
end;

不确定空白放入了什么。不知道NEW.IDPRODUCT是否正确。

以下是一些表格:

BB_PRODUCT (IDPRODUCT, PRODUCTNAME, DESCRIPTION, PRODUCT IMAGE, PRICE,       SALESTART, SALEEND, SALEPRICE, ACTIVE, FEATURED, FEATUREDSTART,  FEATUREDEND, TYPE, IDDEPARTMENT, STOCK, ORDERED, REORDER)

BB_Product_Request (IDREQUEST, IDPRODUCT, DTREQUEST, DTRECD, COST, QTY, IDVENDER)

BB_SALES_SUM (IDPRODUCT, TOT_SALES, TOT_QTY)

BB_PROD_SALES (IDPRODUCT, MONTH, YEAR, QTY, TOTAL)

全新的触发器,任何帮助表示赞赏。感谢。

更新

触发器有效,感谢您的帮助。

使insert语句也可以正常工作。我将所有值都放在单引号中,似乎正在起作用。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

请查看插入声明的文档。您的插入语句写错了:http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9014.htm

或者初学者'友好的教程: http://www.techonthenet.com/oracle/insert.php

您需要指定一个表和列(如果您没有为每列插入值)以将值插入。

以下是空白的答案:

CREATE OR REPLACE TRIGGER TRG_UPDATE_INVENTORY
AFTER INSERT ON BB_PRODUCT_REQUEST FOR EACH ROW 
BEGIN   
UPDATE BB_PRODUCT   
SET STOCK = STOCK - :NEW.QTY
WHERE BB_PRODUCT.IDPRODUCT = :NEW.IDPRODUCT;
end;

您正在插入产品请求(因此触发BB_PRODUCT_REQUEST)并从BB_PRODUCT表中的可用库存中减去请求数量。

答案 1 :(得分:0)

您未显示的内容是LINE的表格定义。如果您希望在INSERT INTO LINE ...之后触发触发器,则触发器必须位于LINE表上。

所以ON ____会被ON LINE取代,因为LINE是表格的名称。

据推测,LINE表中的一列是引用BB_PRODUCT.IDPRODUCT的外键。我们没有在LINE表格中给出关于该列名称的任何指示。 :NEW.foo是引用刚插入foo的行上LINE列的值的正确方法。如果该列在IDPRODUCT表中命名为LINE,那么您所看到的就是正确的。

至于您希望从STOCK减去的值,这取决于LINE表中列的名称。

如果您编写了insert语句以给出要插入的列的名称,那么这将提供读者需要的信息(无需查找LINE表的定义),并且如果有人向表中添加了列,也会阻止INSERT语句中断。

我们只是猜测列的名称:

INSERT INTO LINE (IDORDER, IDPRODUCT, ITEMDESC, QTY, UNITCOST)
VALUES (10, 'C', 'Espresso', 5, 10.00);

如果该行中的5是您想要减去的,请BB_PRODUCTIDPRODUCT = 'C' ...

的行

然后:

  SET STOCK = STOCK - :NEW.QTY

另外,请注意NULL值。如果QTY允许NULL值,并且正在插入的行具有QTY的NULL值,则表达式STOCK - :NEW.QTY(在触发器中的UPDATE语句的SET子句中)将计算为NULl,将分配给STOCK。如果QTY列上有NOT NULL约束,那么我们就避免了这个问题。 (NOT NULL约束会引发异常,并且触发器不会被触发。)