如何使用 Apex Oracle SQL 中另一个 table 的行值触发 table 行值的更新?

how to trigger an update on a table row value using a row value from another table in Apex Oracle SQL?

我有两个table;采购订单:

CREATE TABLE  "PURCHASE_ORDER" 
   (    "PO_NUMBER" NUMBER(*,0) NOT NULL ENABLE, 
    "CUSTOMER_NUMBER" NUMBER(*,0), 
    "PO_DATE" DATE, 
    "PRICE" NUMBER(*,0), 
    "ORDER_QUANTITY" NUMBER, 
    "STOCK_ID" NUMBER(*,0), 
     PRIMARY KEY ("PO_NUMBER")

和散货table:

CREATE TABLE  "BULK_STOCK" 
   (    "STOCK_ID" NUMBER(*,0) NOT NULL ENABLE, 
    "STOCK_DESCRIPTION" VARCHAR2(50), 
    "STOCK_UNITOF_MEASUREMENT" VARCHAR2(50), 
    "STOCK_STATUS" VARCHAR2(50), 
    "FLOOR_ID" NUMBER(*,0), 
    "STOCK_NAME" VARCHAR2(50), 
    "BULK_QUANTITY" NUMBER NOT NULL ENABLE, 
     PRIMARY KEY ("STOCK_ID")

我正在创建一个触发器,当购买 table 插入值时,更新大宗库存 table 中的 BULK_QUANTITY:

create or replace trigger "UPDATE_ON_PURCHASE"
BEFORE
insert or update or delete on "PURCHASE_ORDER"
for each row
begin
UPDATE bulk_stock
    SET BULK_QUANTITY =BULK_QUANTITY-:old.ORDER_QUANTITY
    WHERE STOCK_ID=:old.STOCK_ID;   
end;

当我运行这个表格

大宗库存没有变化table

但如果我硬编码它

create or replace trigger "UPDATE_ON_PURCHASE"
BEFORE
insert or update or delete on "PURCHASE_ORDER"
for each row
begin
UPDATE bulk_stock
    SET BULK_QUANTITY =BULK_QUANTITY- 20 //the 20 would be the inserted ORDER_QUANTITY
    WHERE STOCK_ID= 12 // 12 would be the stock_ID

有效。

这是在 Oracle Apex 软件中完成的。我需要触发器方面的帮助。非常感谢 结束;

您在触发器中使用了 :OLD 值,这似乎有问题。在 INSERT 上,:OLD 值全部为 NULL。因此,对于 INSERT,至少,您似乎想要使用 :NEW 值。

在更新时,:OLD 值包含更新前的值。我不知道您的库存 table 是如何维护的,但在我看来,您希望将 :OLD 值添加回库存,然后从库存中删除 :NEW 值,假设 ORDER_QUANTITY 和 STOCK_ID 可以改变。

当您执行 DELETE 时,:OLD 值包含删除前的值,但 :NEW 值全部为 NULL(如果您考虑一下,这是有道理的)。因此,在删除的情况下,您似乎想要使用 :OLD 值。但是,如果您要删除采购订单,您真的想要调整库存吗?我认为您需要某种类型的订单状态,让您知道它是否已完成或取消或其他,并且只有在订单从未完成时才将库存添加回大宗库存 table。

无论如何,重写触发器的一种方法是:

create or replace trigger UPDATE_ON_PURCHASE
  BEFORE insert or update or delete on PURCHASE_ORDER
  for each row
  begin
    IF INSERTING THEN
      UPDATE bulk_stock
        SET BULK_QUANTITY = BULK_QUANTITY - :NEW.ORDER_QUANTITY
        WHERE STOCK_ID = :NEW.STOCK_ID; 
    ELSIF UPDATING THEN
      UPDATE BULK_STOCK
        SET BULK_QUANTITY = BULK_QUANTITY + :OLD.ORDER_QUANTITY
        WHERE STOCK_ID = :OLD.STOCK_ID; 

      UPDATE BULK_STOCK
        SET BULK_QUANTITY = BULK_QUANTITY - :NEW.ORDER_QUANTITY
        WHERE STOCK_ID = :NEW.STOCK_ID; 
    ELSIF DELETING THEN
      UPDATE BULK_STOCK
        SET BULK_QUANTITY = BULK_QUANTITY + :OLD.ORDER_QUANTITY
        WHERE STOCK_ID = :OLD.STOCK_ID;
    END IF;
  end;

我不确定这个逻辑是否真的是你想要的,因为我不完全理解你想要做什么,特别是在 DELETE 案例中,所以以它为例并应用你的任何逻辑形势所迫。

我还要说,我认为将此逻辑放在触发器中是一个糟糕的选择。诸如此类的业务逻辑不应在触发器中实现 - 最好将其放入过程中并在需要时调用该过程。 Putting business logic into triggers can be problematic.

祝你好运。