在触发期间访问 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;
/
我有三个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;
/