我正在尝试使用purchaseOrder表中的一些详细信息插入到poPayment表中,然后单独购买订单,以我想要的方式开始
buyorder.purchaseorderid添加到popayment.purchaseorderid
在我开始工作后,我想扩展触发器
这是采购订单表;
CREATE TABLE purchaseOrder
(
purchaseOrderid NUMBER (6) NOT NULL,
staffid NUMBER (6),
rawMaterialid2 NUMBER (6) NOT NULL,
supplierContactid2 NUMBER (6),
orderDate DATE NOT NULL,
dueDate DATE,
pricePerUnit NUMBER (7,2),
qty NUMBER,
total NUMBER (7,2),
CONSTRAINT purchaseOrderid PRIMARY KEY(purchaseOrderid)
);
这是采购订单付款表;
CREATE TABLE poPayment
(
poPaymentid NUMBER (6) NOT NULL,
purchaseOrderid NUMBER (6) NOT NULL,
staffid NUMBER (6) NOT NULL,
paymentDate DATE,
amountPaid NUMBER (7,2),
qtyOrdered NUMBER (6),
qtyDelievered NUMBER (6),
invoiceAmount NUMBER (6),
dateDelivered DATE,
CONSTRAINT pk_poPaymentid PRIMARY KEY(poPaymentid)
);
这是我尝试过的触发器
CREATE OR REPLACE TRIGGER createPOpayment_trg
ON purchaseorder
AFTER INSERT
AS BEGIN
INSERT INTO popayment (purchaseorderid)
SELECT
purchaseorder.purchaseorderid
FROM purchaseorder
WHERE purchaseorder.purchaseorderid = popayment.purchaseorderid
END
感谢 布赖恩
答案 0 :(得分:1)
the create trigger
statement的语法不正确; AFTER INSERT' needs to be before the
ON purchaseorder`部分(语法图中的 dml_event_clause )。您还希望它是行级触发器,因此它会为您在表中插入的每一行触发;
CREATE OR REPLACE TRIGGER createPOpayment_trg
AFTER INSERT
ON purchaseorder
FOR EACH ROW
AS
...
但是你当前的插页也是错误的。它会在popayment
中为中的每个行插入一行,该行已经有一个匹配的purchaseorder
行 - 这将会复制所有现有行,而不是为新的采购订单创建一个。
您只想插入与插入的采购订单匹配的单行。并且您需要至少包含所有非空列:
popayment
我猜测(并希望)您有一个序列来填充BEGIN
INSERT INTO popayment (poPaymentid, purchaseorderid, staffid)
VALUES (popayment_seq.nextval, :new.purchaseorderid, :new.staffid);
END;
主键。其他两个值来自插入的poPaymentid
记录,使用purchaseorder
伪记录。您不想查询要插入的表。
如果密钥是由它自己的触发器设置的,那么你只需要给另外两个非空列(再加上你以后添加的那些):
:new