2012-03-26 63 views
1

完全に動作している次のDML文を持っていますが、これをトリガにしようとしましたが動作しません。Oracleトリガーのエラー、無効な識別子

DML文の

UPDATE HOLIDAY_RESERVATION R SET SUBTOTAL = 
    NVL((SELECT F.FLI_PRICE FROM FLIGHT F WHERE F.FLI_ID = R.IN_FLIGHT_ID), 0) * NVL(R.IN_FLIGHT_SEATS_NO,0) + 
    NVL((SELECT F.FLI_PRICE FROM FLIGHT F WHERE F.FLI_ID = R.OUT_FLIGHT_ID), 0)* NVL(R.OUT_FLIGHT_SEATS_NO,0) + 
    NVL((SELECT AC.ACC_PRICEPN FROM ACCOMMODATION AC WHERE AC.ACC_ID = R.ACC_ID), 0); 

TRIGGER文

CREATE OR REPLACE TRIGGER HR_SUBTOTAL 
BEFORE INSERT OR UPDATE ON HOLIDAY_RESERVATION 
FOR EACH ROW 
BEGIN 
    SELECT 
     NVL((SELECT F.FLI_PRICE FROM FLIGHT F WHERE F.FLI_ID = :NEW.IN_FLIGHT_ID), 0) * NVL(R.IN_FLIGHT_SEATS_NO,0) + 
     NVL((SELECT F.FLI_PRICE FROM FLIGHT F WHERE F.FLI_ID = :NEW.OUT_FLIGHT_ID), 0) * NVL(R.OUT_FLIGHT_SEATS_NO,0) + 
     NVL((SELECT AC.ACC_PRICEPN FROM ACCOMMODATION AC WHERE AC.ACC_ID = :NEW.ACC_ID), 0) 
     INTO :NEW.SUBTOTAL 
    FROM DUAL; 
END; 


Errors for TRIGGER HR_SUBTOTAL: 

LINE/COL ERROR 
-------- ---------------------------------------------------------------- 
2/4  PL/SQL: SQL Statement ignored 
4/92  PL/SQL: ORA-00904: "R"."OUT_FLIGHT_SEATS_NO": invalid identifier 
エラーは、私が掛けるビットを取り除くならば、それは多分それが動作するため、*乗算ビットにしておく必要があり

かっこで囲まれているか、別の選択肢で囲まれていなければなりません。

+0

トリガコードで 'R'は何を次のようにselect文でOLDオプション:NEWまたは? – turbanoff

+0

Rは単なるエイリアスです –

+0

何のエイリアスですか? – turbanoff

答えて

2

クエリにRのエイリアスが設定されていません。

あなたは使用する必要があります。

SELECT 
    NVL((SELECT F.FLI_PRICE FROM FLIGHT F WHERE F.FLI_ID = :NEW.IN_FLIGHT_ID), 0) * NVL(:OLD.IN_FLIGHT_SEATS_NO,0) + 
    NVL((SELECT F.FLI_PRICE FROM FLIGHT F WHERE F.FLI_ID = :NEW.OUT_FLIGHT_ID), 0) * NVL(:OLD.OUT_FLIGHT_SEATS_NO,0) + 
    NVL((SELECT AC.ACC_PRICEPN FROM ACCOMMODATION AC WHERE AC.ACC_ID = :NEW.ACC_ID), 0) 
    INTO :NEW.SUBTOTAL 
FROM DUAL; 
+0

おかげで私は私を救ったと同等になります:) –

+1

あなたは大歓迎です! – GuZzie

関連する問題