2011-03-04 33 views
-3
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; 
/
+0

錯誤消息至少會指向哪一行代碼具有違規標識符。 –

+0

不是你錯誤的原因,但是第一條UPDATE語句將更新表中的每一行 - 是你想要的嗎? –

+0

@Jeffrey:有一個訂單表,它沒有這三列:expected_ship,expected_receive和actual_receive。所以,我改變了Orders表來添加這三個屬性。現在,對於訂單表中的每個新插入,我必須確保expected_ship和expected_receive會自動更新。 – indolent

回答

4

Oracle可以看到您的表結構。我們不能。我打賭甲骨文在你的代碼中看到了這個問題。

它應該指向錯誤的第一行。如果沒有,請從user_errors中選擇*;

也許你的ORDERS表沒有SHIP_DATE(因爲第一條語句談到了EXPECTED_SHIP_DATE)。

+0

我創建了物化視圖,當我嘗試創建INSTEAD OF觸發器時,它說:「無法在表上創建INSTEAD OF觸發器」。這很奇怪。 – indolent

3

不是Oracle的傢伙,但你不應該使用

:OLD.SHIP_DATE 

:NEW.SHIP_DATE 

:OLD.ORDER_DATE 

:NEW.ORDER_DATE 

參考:Oracle's trigger doc

1

對不起,爲什麼不在訂單表上創建o BEFORE INSERT觸發器?當創建BEFORE INSERT觸發器時,如果在訂單表中添加新行,可以使用.NEW.EXPECTED_SHIP_DATE,.NEW.EXPECTED_RECEIVE_DATE更新訂單表。不要在訂單上創建實體化視圖