2016-11-16 66 views
1

我有两个表;采购订单:如何使用来自Apex Oracle SQL中另一个表的行值触发表行值的更新?

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

回答

4

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

在UPDATE上:OLD值包含更新前的值。我不知道你的股票表是如何维护的,但在我看来,如果ORDER_QUANTITY和STOCK_ID都可以更改,那么在将旧的价值添加到股票中,然后从股票中删除:NEW价值。

当你做一个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

祝你好运。

+0

它像一个魅力工作谢谢! – kuhle

相关问题