2011-03-04 10 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:ordersテーブルがあり、expected_ship、expected_receive、およびactual_receiveという3つの列はありません。そこで、これらの3つの属性を追加するためにOrdersテーブルを変更しました。さて、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 
012を使用しないでください

参照先:Oracle's trigger doc

1

ごめんなさい、オーダーテーブルにBEFORE INSERTトリガーを作成しないでください。 BEFORE INSERTトリガを作成するときに、注文表に新しい行を追加すると、.NEW.EXPECTED_SHIP_DATE、.NEW.EXPECTED_RECEIVE_DATE更新注文表を使用できます。注文時にマテリアライズド・ビューを作成しないでください

関連する問題