触发递增日期并插入另一个表

时间:2013-12-05 20:15:30

标签: oracle plsql triggers dateadd

我想在Oracle中创建一个触发器。当我的订单表中的dateOrdReceived被更新或插入时,触发器将采用此日期,并将其更新14天到另一个表productList ordDateDelivery中,以便它等于

dateOrdReceived + 14 days = new ordDateDelivery

我确实有过几次尝试,并且猜到我需要一个可以加入我的两个表的查询。我还了解到,使用DATEADD可能会让我增加14天,但总的来说我不能完全正确。

我的触发尝试

`CREATE OR REPLACE TRIGGER  "PRODUCTLIST_DATE_DELIVERY" 
BEFORE
insert or update on "PRODUCTLIST"
for each row

begin
select p.dateOrdRecieved, o.ordDateDelivery
from productList p JOIN orders o
ON p.ordID = o.ordID;

new.OrdDateDelivery := DATEADD(day,14,new.p.dateOrdRecieved)

end;


/
ALTER TRIGGER  "PRODUCTLIST_DELIVERY_DATE" ENABLE

我的触发器表格如下

PRODUCTLIST TABLE

CREATE TABLE  "PRODUCTLIST" 
(   "ORDID" NUMBER(3,0) NOT NULL ENABLE, 
"PRODUCTID" NUMBER(3,0) NOT NULL ENABLE, 
"QUANTITY" NUMBER(4,2) NOT NULL ENABLE, 
"ORDDATEDELIVERY" DATE, 
"DISCOUNT" NUMBER(3,0), 
"TOTALCOST" NUMBER(4,2), 
 CONSTRAINT "PK_PRODUCTLIST" PRIMARY KEY ("ORDID", "PRODUCTID") ENABLE
)
/
ALTER TABLE  "PRODUCTLIST" ADD CONSTRAINT "FK_ORDERS" FOREIGN KEY ("ORDID")
  REFERENCES  "ORDERS" ("ORDID") ENABLE
/
ALTER TABLE  "PRODUCTLIST" ADD CONSTRAINT "FK_PRODUCTS" FOREIGN KEY ("PRODUCTID")
  REFERENCES  "PRODUCT" ("PRODUCTID") ENABLE
/

ORDERS TABLE

CREATE TABLE  "ORDERS" 
(   "ORDID" NUMBER(3,0) NOT NULL ENABLE, 
"DATEORDRECIEVED" DATE, 
"CUSID" NUMBER(3,0) NOT NULL ENABLE, 
 PRIMARY KEY ("ORDID") ENABLE
)
/
ALTER TABLE  "ORDERS" ADD CONSTRAINT "FK_CUSTOMER" FOREIGN KEY ("CUSID")
  REFERENCES  "CUSTOMER" ("CUSID") ENABLE
/

1 个答案:

答案 0 :(得分:3)

DATEADD() 是Oracle函数... Oracle的datetime arithmetic基于当天。如果你在一个日期加1,它会将日期增加一天,加上1.5乘36小时等等。

现在,你的触发器。

您无法自动更新记录或将记录插入另一个表。触发器在一个表“上”,这意味着您需要创建DML才能将其添加或更新到该表中。

update productlist
   set dateOrdRecieved = :new.OrdDateDelivery + 14
 where ordid = :new.ordid

此处:new.引用触发器所在表的新数据。它是您可以访问的特定“变量”,而不是您尝试实现的一般概念。您无法使用它直接将数据分配给其他表,但您可以将其用作这样做的手段。

接下来,你需要考虑你的触发器在哪里。您希望在PRODUCTLIST发生更改时更新ORDERS,这意味着触发器需要位于表ORDERS上。

create or replace trigger productlist_date_delivery
 before insert or update on orders
 for each row
begin
    update productlist
       set OrdDateDelivery = :new.dateOrdRecieved + 14
     where ordid = :new.ordid;
end;
/

请注意您自己的一些额外差异:

  1. 我使用:new.代替new.
  2. 我不是从桌子上选择的;由于数据已经可用,因此无需执行此操作。当你选择Oracle试图更新的数据时,它也是不可能的,它禁止这样做以确保完整性。
  3. 我没有使用套件标识符。没有必要这样做;默认情况下,Oracle大写所有内容。如果一切都不是大写的话你也要记得
  4. ,这也很痛苦
  5. 每个陈述以分号结尾。
  6. 如果您遇到问题我建议Tech on the Net,它有一个很好的基本指南。与往常一样,CREATE TRIGGER statement上有文档。