2013-12-05 3 views
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 
/

ответ

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. Каждый оператор заканчивается в виде двоеточия.

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

Смежные вопросы