为什么这个触发器失败了?它表示无效的标识符

时间:2011-03-04 05:25:15

标签: sql oracle ora-00904

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;
/

3 个答案:

答案 0 :(得分:4)

Oracle可以看到您的表结构。我们做不到。我打赌Oracle会在您的代码中看到问题。

它应该指向带错误的第一行。如果没有,请从user_errors;

中选择*

也许你的ORDERS表没有SHIP_DATE(因为第一个语句是关于EXPECTED_SHIP_DATE的)。

答案 1 :(得分:3)

不是Oracle人员,但你不应该使用

:OLD.SHIP_DATE

:NEW.SHIP_DATE

:OLD.ORDER_DATE

:NEW.ORDER_DATE

参考:Oracle's trigger doc

答案 2 :(得分:1)

对不起,为什么不在订单表上创建o BEFORE INSERT触发器?当创建BEFORE INSERT触发器时,如果在orders表中添加新行,可以使用.NEW.EXPECTED_SHIP_DATE,.NEW.EXPECTED_RECEIVE_DATE更新订单表。不要在订单上创建物化视图