Oracle APEX - 插入后,更新另一个表触发器

时间:2016-04-20 18:09:49

标签: sql oracle plsql

我正在尝试使用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

感谢 布赖恩

1 个答案:

答案 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