Триггер для увеличения даты и вставки в другую таблицу

Я хочу создать триггер в 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
/

person user3071845    schedule 05.12.2013    source источник


Ответы (1)


DATEADD() не функция Oracle... Oracle дата-время арифметика основано на дне. Если вы добавляете 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. Каждое выражение заканчивается точкой с запятой.

Если у вас возникли проблемы, я рекомендую Tech on the Net, там есть хорошее базовое руководство. . Как всегда, есть документация по оператору CREATE TRIGGER. .

person Ben    schedule 05.12.2013