【问题标题】:Trigger for incrementing a date and inserting into another table用于增加日期并插入另一个表的触发器
【发布时间】:2013-12-05 20:15:30
【问题描述】:

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

【问题讨论】:

    标签: oracle plsql triggers dateadd


    【解决方案1】:

    DATEADD() 不是 Oracle 函数...Oracle 的datetime arithmetic 每天都有。如果您将 1 添加到日期,则会将日期增加 1 天,将 1.5 增加 36 小时等。

    现在,你的触发器。

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

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

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

    接下来你需要考虑在哪里你的触发器在哪里。您希望在 ORDERS 更改时更新 PRODUCTLIST,这意味着触发器需要在表上 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 statement 上有文档。

    【讨论】:

      猜你喜欢
      • 2013-10-06
      • 2021-07-15
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      • 2013-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多