0

我想在 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
/
4

1 回答 1

3

DATEADD()不是Oracle 函数... Oracle 的日期时间算法是基于一天的。如果您将 1 添加到日期,则会将日期增加 1 天,将 1.5 增加 36 小时等。

现在,你的触发器。

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

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

这里:new.引用了触发器所在表的新数据。它是您可以访问的特定“变量”,而不是您要达到的目标的一般概念。您不能使用它直接将数据分配给其他表,但您可以使用它作为这样做的一种方式。

接下来,您需要考虑触发器在哪里。您希望在更改PRODUCTLIST时进行更新ORDERS,这意味着触发器需要在 table 上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. 每个语句都以分号结尾。

如果您遇到问题,我推荐Tech on the Net,它有一个很好的基本指南。不过,与往常一样,有关于CREATE TRIGGER 语句的文档。

于 2013-12-05T20:47:50.300 回答