Database oraclesql中的触发器

Database oraclesql中的触发器,database,oracle,Database,Oracle,我想创建一个触发器,在插入发票后,产品中的产品数量将减少报价单中的产品销售数量 CREATE TABLE INVOICE ( INVOICE_NUMBER NUMBER(10) PRIMARY KEY, QUOTATION_NUMBER NUMBER(10) NOT NULL, CUSTOMER_ID NUMBER(10) NOT NULL, STAFF_ID NUMBER(10) NOT NULL, INVOICE_DATE DATE NOT NULL, INVOICE_BALANCE NUM

我想创建一个触发器,在插入发票后,
产品
中的
产品数量
将减少
报价单
中的
产品销售数量

CREATE TABLE INVOICE
(
INVOICE_NUMBER NUMBER(10) PRIMARY KEY,
QUOTATION_NUMBER NUMBER(10) NOT NULL,
CUSTOMER_ID NUMBER(10) NOT NULL,
STAFF_ID NUMBER(10) NOT NULL,
INVOICE_DATE DATE NOT NULL,
INVOICE_BALANCE NUMBER(10,2) NOT NULL,
FOREIGN KEY (QUOTATION_NUMBER) REFERENCES QUOTATION(QUOTATION_NUMBER),
FOREIGN KEY (CUSTOMER_ID) REFERENCES CUSTOMER(CUSTOMER_ID),
FOREIGN KEY (STAFF_ID) REFERENCES STAFF(STAFF_ID),
CONSTRAINT INVOICE_BALANCE_CK CHECK (INVOICE_BALANCE>=0)
);

CREATE TABLE QUOTATION_DETAIL
(
QUOTATION_NUMBER NUMBER(10),
PRODUCT_CODE NUMBER(10),
PRODUCT_SELL_QUANTITY NUMBER(5) NOT NULL,
PRIMARY KEY (QUOTATION_NUMBER,PRODUCT_CODE),
FOREIGN KEY (QUOTATION_NUMBER) REFERENCES QUOTATION(QUOTATION_NUMBER),
FOREIGN KEY (PRODUCT_CODE) REFERENCES PRODUCT(PRODUCT_CODE),
CONSTRAINT PRODUCT_SELL_QUANTITY_CK CHECK (PRODUCT_SELL_QUANTITY>0)
);

CREATE TABLE PRODUCT
(
PRODUCT_CODE NUMBER(10) PRIMARY KEY,
PRODUCT_NAME VARCHAR2(20) NOT NULL,
PRODUCT_QUANTITY NUMBER(5) NOT NULL,
PRODUCT_MANUFACTURER_PRICE NUMBER(10,2) NOT NULL,
PRODUCT_SELLING_PRICE NUMBER(10,2) NOT NULL,
PRODUCT_WARRANTY NUMBER(5),
PRODUCT_WEIGHT NUMBER(5,2),
PRODUCT_LENGTH VARCHAR2(30),
PRODUCT_WIDTH VARCHAR2(30),
PRODUCT_HEIGHT VARCHAR2(30),
PRODUCT_MATERIAL VARCHAR2(30),
MANUFACTURER_COUNTRY VARCHAR2(20),
PRODUCT_REMARK VARCHAR2(100),
SUPPLIER_ID NUMBER(10) NOT NULL,
PRODUCT_CATEGORY_NUMBER NUMBER(5) NOT NULL,
FOREIGN KEY (SUPPLIER_ID) REFERENCES SUPPLIER(SUPPLIER_ID),
FOREIGN KEY (PRODUCT_CATEGORY_NUMBER) REFERENCES PRODUCT_CATEGORY(PRODUCT_CATEGORY_NUMBER)
);
当我运行它时,它显示

CREATE OR REPLACE TRIGGER PRODUCT_QUANTITY_CHANGE
AFTER INSERT OR UPDATE OF INVOICE_NUMBER ON INVOICE
DECLARE
TEMP_QUOTATION_NUMBER NUMBER(10);
BEGIN
SELECT QUOTATION_NUMBER INTO TEMP_QUOTATION_NUMBER FROM INVOICE WHERE
INVOICE_NUMBER = (SELECT MAX(INVOICE_NUMBER) FROM INVOICE);
UPDATE PRODUCT
SET PRODUCT.PRODUCT_QUANTITY = PRODUCT.PRODUCT_QUANTITY -
QUOTATION_DETAIL.PRODUCT_SELL_QUANTITY
WHERE QUOTATION_NUMBER = TEMP_QUOTATION_NUMBER AND PRODUCT.PRODUCT_CODE =  
QUOTATION_DETAIL.PRODUCT_CODE;
END;

请向我们展示您尝试写入触发器的情况。您是否在触发器之外测试了更新SQL?您的UPDATE语句现在不知道详细信息是什么。您可能想要使用:NEW.PRODUCT_代码(和[引用触发器定义中的构造]())。顺便说一句,如果你有很多发票,那么你的发票可能会有性能差和锁(可能是死锁)。是的,Grzegorz Kazior——这就是为什么我建议在触发器之外测试更新的原因。它会失败,他可以正确地重新书写。问题在于更新SQL和报价单明细表。请查看Oracle文档中的更新语法/用法。请向我们展示您编写触发器的尝试。您是否在触发器之外测试了更新SQL?您的更新语句现在不知道详细信息是什么。您可能想要使用:NEW.PRODUCT_代码(和[引用触发器定义中的构造]())。顺便说一句,如果你有很多发票,那么你的发票可能会有性能差和锁(可能是死锁)。是的,Grzegorz Kazior——这就是为什么我建议在触发器之外测试更新的原因。它会失败,他可以正确地重新书写。问题在于更新SQL和报价单明细表。请查看Oracle文档中的更新语法/用法。
Trigger PRODUCT_QUANTITY_CHANGE compiled
Errors: check compiler log
Error(5,1): PL/SQL: SQL Statement ignored
Error(7,75): PL/SQL: ORA-00904: "QUOTATION_DETAIL"."PRODUCT_CODE": invalid
identifier