Oracle 用于递增日期并插入到另一个表中的触发器

Oracle 用于递增日期并插入到另一个表中的触发器,oracle,plsql,triggers,dateadd,Oracle,Plsql,Triggers,Dateadd,我想在Oracle中创建一个触发器。当更新或插入“我的订单”表中的dateOrdReceived时,触发器将获取该日期,不管它是什么,并将其更新14天到另一个表productList ordDateDelivery中,使其等于 dateOrdReceived + 14 days = new ordDateDelivery 我确实做了几次尝试,并猜测我需要一个将我的两个表连接起来的查询。我还了解到,也许使用DATEADD可以让我增加14天,但总的来说,我不能完全正确 我的触发尝试 `CREATE

我想在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函数。。。甲骨文的总部设在一天左右。如果你给一个日期加1,它会将日期增加一天,将1.5增加36小时,以此类推

现在,你的扳机

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

update productlist
   set dateOrdRecieved = :new.OrdDateDelivery + 14
 where ordid = :new.ordid
:new.
此处引用触发器所在表的新数据。这是一个你可以访问的特定“变量”,而不是你试图实现的一般概念。您不能使用它直接将数据分配给其他表,尽管您可以使用它作为这样做的一种手段

下一步你需要考虑触发器的位置。无论何时更改
订单
,您都希望更新
产品列表
,这意味着触发器需要位于表
订单

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;
/
请注意您自己的一些额外差异:

  • 我使用
    :new.
    而不是
    new.
  • 我不是从表中选择;没有必要这样做,因为数据已经可用。当您选择Oracle试图更新的数据时,这也是不可能的,它禁止这样做以确保完整性
  • 我还没有使用cased标识符。没有必要这样做;默认情况下,Oracle大写所有内容。如果一切都不是你必须记住的大写字母,那真的很痛苦
  • 每条语句都以分号结尾
  • 如果你有我推荐的问题,它有一个很好的基本指南。与往常一样,上有文档。

    不是Oracle函数。。。甲骨文的总部设在一天左右。如果你给一个日期加1,它会将日期增加一天,将1.5增加36小时,以此类推

    现在,你的扳机

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

    update productlist
       set dateOrdRecieved = :new.OrdDateDelivery + 14
     where ordid = :new.ordid
    
    :new.
    此处引用触发器所在表的新数据。这是一个你可以访问的特定“变量”,而不是你试图实现的一般概念。您不能使用它直接将数据分配给其他表,尽管您可以使用它作为这样做的一种手段

    下一步你需要考虑触发器的位置。无论何时更改
    订单
    ,您都希望更新
    产品列表
    ,这意味着触发器需要位于表
    订单

    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;
    /
    
    请注意您自己的一些额外差异:

  • 我使用
    :new.
    而不是
    new.
  • 我不是从表中选择;没有必要这样做,因为数据已经可用。当您选择Oracle试图更新的数据时,这也是不可能的,它禁止这样做以确保完整性
  • 我还没有使用cased标识符。没有必要这样做;默认情况下,Oracle大写所有内容。如果一切都不是你必须记住的大写字母,那真的很痛苦
  • 每条语句都以分号结尾
  • 如果你有我推荐的问题,它有一个很好的基本指南。与往常一样,上有文档。

    不是Oracle函数。。。甲骨文的总部设在一天左右。如果你给一个日期加1,它会将日期增加一天,将1.5增加36小时,以此类推

    现在,你的扳机

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

    update productlist
       set dateOrdRecieved = :new.OrdDateDelivery + 14
     where ordid = :new.ordid
    
    :new.
    此处引用触发器所在表的新数据。这是一个你可以访问的特定“变量”,而不是你试图实现的一般概念。您不能使用它直接将数据分配给其他表,尽管您可以使用它作为这样做的一种手段

    下一步你需要考虑触发器的位置。无论何时更改
    订单
    ,您都希望更新
    产品列表
    ,这意味着触发器需要位于表
    订单

    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;
    /
    
    请注意您自己的一些额外差异:

  • 我使用
    :new.
    而不是
    new.
  • 我不是从表中选择;没有必要这样做,因为数据已经可用。当您选择Oracle试图更新的数据时,这也是不可能的,它禁止这样做以确保完整性
  • 我还没有使用cased标识符。没有必要这样做;默认情况下,Oracle大写所有内容。如果一切都不是你必须记住的大写字母,那真的很痛苦
  • 每条语句都以分号结尾
  • 如果你有我推荐的问题,它有一个很好的基本指南。与往常一样,上有文档。

    不是Oracle函数。。。甲骨文的总部设在一天左右。如果你给一个日期加1,它会将日期增加一天,将1.5增加36小时,以此类推

    现在,你的扳机

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

    update productlist
       set dateOrdRecieved = :new.OrdDateDelivery + 14
     where ordid = :new.ordid
    
    :new.
    此处引用触发器所在表的新数据。这是一个特定的“变量”,你可以访问它,而不是一个普通的co