我有两张桌子
订单(身份证明,日期,备注)
和
交货(同上,注,日期)
我想创建一个触发器,在订单更新日期时更新交货日期。
我正在考虑做类似
的事情CREATE OR REPLACE TRIGGER your_trigger_name
BEFORE UPDATE
ON Order
DECLARE
BEGIN
UPDATE Delivery set date = ??? where id = ???
END;
如何获取日期和行ID?
感谢
答案 0 :(得分:16)
如何获取日期和行ID?
假设这些是您的ORDER表上名为DELIVERY_DATE和ID的列,您的触发器应如下所示:
CREATE OR REPLACE TRIGGER your_trigger_name
BEFORE UPDATE ON Order
FOR EACH ROW
BEGIN
if :new.delivery_date != :old.delivery_date
then
UPDATE Delivery d
set d.delivery_date = :new.delivery_date
where d.order_id = :new.id;
end if;
END;
请注意FOR EACH ROW子句:引用各行的值是必需的。我使用IF构造来测试是否在交付时执行UPDATE。如果您的触发器中没有其他逻辑,您可以像这样编写它......
CREATE OR REPLACE TRIGGER your_trigger_name
BEFORE UPDATE OF delivery_date ON Order
FOR EACH ROW
BEGIN
UPDATE Delivery d
set d.delivery_date = :new.delivery_date
where d.order_id = :new.id;
END;
我已经回答了你提出的问题但是,除此之外,我会指出你的数据模型是次优的。正确规范化的设计只能在一个表上保存DELIVERY_DATE:DELIVERY似乎是合乎逻辑的地方。
答案 1 :(得分:0)
触发器中有一个隐含的新旧引用,其形式为: 将旧的推荐为新的
您可以写入:NEW值,但不能写入:OLD值。
UPDATE Delivery set date = :new.delivery_date where id = :new.id;
CREATE OR REPLACE TRIGGER "BUR_TABLENAME" BEFORE
UPDATE ON "TABLE" FOR EACH ROW
BEGIN
If :new.active_date is not null Then
:new.active_date := TRUNC(:new.active_date);
End If;
END;
<强>模板:强>
CREATE OR REPLACE TRIGGER TRIGGER_NAME
BEFORE
UPDATE
ON TABLE_NAME
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
DECLARE
V_VARIABLE NUMBER (1);
BEGIN
//Do Stuff;
null;
end;
答案 2 :(得分:0)
使用OLD和NEW绑定变量。 OLD引用在更改之前更新的行或列;更新后新的引用它。
CREATE OR REPLACE TRIGGER trig1
BEFORE UPDATE
ON order REFERENCING NEW AS new
FOR EACH ROW
BEGIN
UPDATE delivery
SET ddate = :new.ddate
WHERE id = :new.id;
END;
您可以修改REFERENCING
子句,为绑定变量赋予不同的名称。您也可以添加OLD as <name>
。例如:
CREATE OR REPLACE TRIGGER trig1
BEFORE UPDATE
ON order REFERENCING OLD AS old_values NEW AS new_values
...
如果您不想更改“旧”和“新”的默认名称,则可以完全省略REFERENCING
子句。
答案 3 :(得分:0)
每当需要这种触发器时,请仔细查看您的设计。是否真的需要单独的交付记录?订单真的有超过1次交货吗?
触发器似乎很好但是它们确实很容易搞砸了。