如何使用 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.
祝你好运。
我有两个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.
祝你好运。