如何使用来自Apex Oracle SQL中另一个表的行值触发表行值的更新?
问题描述:
我有两个表;采购订单:如何使用来自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;
当我运行这种形式
没有什么变化的大宗股票表
但如果我硬编码
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值。
在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。
祝你好运。
它像一个魅力工作谢谢! – kuhle