尝试制作一个从库存中取走(销售)商品的触发器。当我进入:
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语句也可以正常工作。我将所有值都放在单引号中,似乎正在起作用。
感谢您的帮助。
答案 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_PRODUCT
中IDPRODUCT = 'C'
...
然后:
SET STOCK = STOCK - :NEW.QTY
另外,请注意NULL
值。如果QTY
允许NULL值,并且正在插入的行具有QTY
的NULL值,则表达式STOCK - :NEW.QTY
(在触发器中的UPDATE语句的SET子句中)将计算为NULl
,将分配给STOCK
。如果QTY
列上有NOT NULL约束,那么我们就避免了这个问题。 (NOT NULL约束会引发异常,并且触发器不会被触发。)