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

时间:2016-11-16 11:56:03

标签: sql database oracle oracle-apex

我有两张桌子;采购订单:

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")

和散装库存表:

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")

我正在创建一个触发器,当使用值插入购买表时更新批量库存表中的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;

当我运行此表单时

enter image description here

批量库存表中没有任何变化

但如果我硬编码

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软件中完成的。我需要触发器的帮助。非常感谢 端;

1 个答案:

答案 0 :(得分:4)

您在触发器中使用:OLD值似乎有问题。在INSERT上:OLD值都是NULL。所以在INSERT的情况下,至少,你似乎想要使用:NEW值。

在UPDATE上:OLD值包含更新前的值。我不知道你的库存表是如何维护的,但在我看来,你想要将:OLD值重新添加到库存中然后从库存中删除:NEW值,假设ORDER_QUANTITY和STOCK_ID都可以更改。

当你正在执行DELETE时:OLD值包含删除前的值,但是:NEW值都是NULL(如果你考虑的话,这是有意义的)。因此,在删除的情况下,您似乎想要使用:OLD值。但是,如果您要删除PO,那么确实想要调整库存吗?我认为您需要某种类型的订单状态才能告知您是否已经履行或取消或等等,并且只有在订单从未履行时才将库存添加回批量库存表。

在任何情况下,重新编写触发器的一种方法是:

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

祝你好运。