【发布时间】:2011-07-08 13:59:00
【问题描述】:
CREATE MATERIALIZED VIEW ORDERS_MV
BUILD IMMEDIATE
REFRESH COMPLETE ON DEMAND AS
SELECT * FROM ORDERS;
---------------------------------------
CREATE OR REPLACE TRIGGER update_ship_receive
INSTEAD OF INSERT ON ORDERS_MV
FOR EACH ROW
BEGIN
UPDATE ORDERS SET EXPECTED_SHIP_DATE = ORDER_DATE+5;
UPDATE ORDERS SET EXPECTED_RECEIVE_DATE = SHIP_DATE+1
WHERE SHIPPING_METHOD = '1 DAY';
UPDATE ORDERS SET EXPECTED_RECEIVE_DATE = SHIP_DATE+2
WHERE SHIPPING_METHOD = '2 DAY';
UPDATE ORDERS SET EXPECTED_RECEIVE_DATE = SHIP_DATE+5
WHERE SHIPPING_METHOD = 'GROUND';
END;
/
【问题讨论】:
-
错误消息至少会指出哪一行代码具有违规标识符。
-
不是您的错误的原因,但第一个 UPDATE 语句将更新表中的每一行 - 这是您想要的吗?
-
@Jeffrey:有一个订单表,它没有这三列:expected_ship、expected_receive 和actual_receive。因此,我更改了 Orders 表以添加这三个属性。现在,对于订单表中的每个新插入,我必须确保自动更新 expected_ship 和 expected_receive。
-
所以我创建了 Orders_MV,并创建了从 Orders_MV 获取信息的而不是触发器,并更新了 Orders 表。但由于某种原因,它对我不起作用。尽管我在 MV 上创建了 INSTEAD OF 触发器,但它告诉我“无法在表上创建 INSTEAD OF 触发器”。我还尝试将触发器更改为 BEFORE 和 AFTER,当我检查添加新行时 Orders 表是否更新时,它没有更新。太令人沮丧了!
-
为什么这个视图会具体化?查询一个对一个表执行查找并且只对这个表执行查找的视图,效率并不比直接查询该表低。