【问题标题】:Oracle APEX - AFTER INSERT, UPDATE another table triggerOracle APEX - 插入后,更新另一个表触发器
【发布时间】:2016-04-20 18:09:49
【问题描述】:

我正在尝试将purchaseOrder 表中的一些详细信息插入到poPayment 表中,然后在purchaseorder 上插入,首先我想要

purchaseorder.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

谢谢 布赖恩

【问题讨论】:

  • 当您尝试创建该触发器或在purchaseorder 表中插入一行时发生了什么?您是否收到错误,或者不是您预期的结果?在创建采购订单时而不是在实际付款时创建付款记录真的有意义吗?
  • 当我尝试运行触发器时,我收到错误:ORA-04071:缺少 BEFORE、AFTER 或 INSTEAD OF 关键字。有一个单独的付款表,因为他们可以在交货后付款

标签: sql oracle plsql


【解决方案1】:

the create trigger statement 的语法不正确; AFTER INSERT' needs to be before theON purchaseorder` 部分(语法图中的 dml_event_clause)。您还希望它是一个行级触发器,因此它会为您在表中插入的每一行触发;

CREATE OR REPLACE TRIGGER createPOpayment_trg
AFTER INSERT
ON purchaseorder
FOR EACH ROW
AS
...

但是你当前的插入也是格式错误的。它将为purchaseorder 中已经有匹配popayment 行的每一 行插入一行到popayment - 这将复制所有现有行,而不是为您的新购买创建一个行顺序。

您只想插入与插入的采购订单匹配的单行。而且您至少需要包含所有非空列:

BEGIN
  INSERT INTO popayment (poPaymentid, purchaseorderid, staffid)
  VALUES (popayment_seq.nextval, :new.purchaseorderid, :new.staffid);
END;

我猜测(并希望)您有一个序列来填充 poPaymentid 主键。其他两个值来自插入的purchaseorder 记录,使用:new 伪记录。您不想查询要插入的表。

如果键是由它自己的触发器设置的,那么你只需要提供另外两个非空列(加上你以后添加的更多):

BEGIN
  INSERT INTO popayment (purchaseorderid, staffid)
  VALUES (:new.purchaseorderid, :new.staffid);
END;

【讨论】:

  • 嗨,Alex,感谢您的输入,我确实有 ID 的序列和触发器; CREATE SEQUENCE poPaymentid_auto_incr START WITH 1 INCREMENT BY 1; CREATE OR REPLACE TRIGGER poPaymentid_auto_trigger BEFORE INSERT ON poPayment FOR EACH ROW BEGIN :new.poPaymentid := poPaymentid_auto_incr.nextval; END;
  • 好的,那么您不需要在此插入中提供该列,但您需要 Staffid。
猜你喜欢
  • 1970-01-01
  • 2020-04-07
  • 1970-01-01
  • 2020-08-23
  • 1970-01-01
  • 1970-01-01
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多