在触发期间访问 table

Accessing to a table during trigger

我有三个table:

Customer(CustomerID,Name)

CustInvoice(InvoiceID, CustomerID (FK to Customer), CustName)

ProductOrder(OrderID,OrderDate,CustomerID (FK to Customer))

我想编写如下触发器:

"Whenever there’s a new order in ProductOrder table, this trigger generates a CustInvoice"

我试着这样写:

CREATE OR REPLACE TRIGGER DoCustInvoice
    AFTER INSERT ON ProductOrder
        INSERT INTO CustInvoice(InvoiceSEQ.NEXTVAL,????)
    END;
/

但我不知道如何在此触发器期间访问 Customer table 以使用 Trigger 访问 Customer Table 中的 Name! 谁能给我解释一下我该怎么办?

谢谢

delimiter $$
CREATE TRIGGER DoCustInvoice AFTER INSERT ON ProductOrder FOR EACH ROW BEGIN
    INSERT INTO CustInvoice(CustomerID,CustName) VALUES(new.CustomerID,new.CustomerName);
END

首先,您需要将触发时间更改为触发 "after each row that the triggering statement affect"。 See here

其次,在这种情况下,ProductOrder 的 table 中有 CustomerID 和 CustomerName,您可以通过 Pseudorecords 使用它们。 See here

CREATE OR REPLACE TRIGGER DoCustInvoice
AFTER INSERT ON ProductOrder
FOR EACH ROW
BEGIN
    INSERT INTO CustInvoice(InvoiceID,CustomerID,CustName) 
    VALUES (InvoiceSEQ.NEXTVAL, :NEW.CustomerID, :NEW.CustomerName);
END;
/

但是,如果需要,您可以在触发器中使用 select 语句。

CREATE OR REPLACE TRIGGER DoCustInvoice
AFTER INSERT ON ProductOrder
FOR EACH ROW
DECLARE
  v_custname Customer.Name%TYPE;
BEGIN
SELECT Customer.Name 
INTO v_custname 
FROM Customer 
WHERE CustomerID = :NEW.CustomerID;
INSERT INTO CustInvoice (InvoiceID,CustomerID,CustName ) 
VALUES (InvoiceSEQ.NEXTVAL, :NEW.CustomerID, v_custname);
END;
/