2012-03-26 59 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); 

觸發聲明

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'在觸發代碼? – turbanoff 2012-03-26 09:16:35

+0

R只是一個別名 – 2012-03-26 09:18:05

+0

別名爲什麼? – turbanoff 2012-03-26 09:18:24

回答

2

查詢中沒有爲R設置別名。

,您應該使用:NEW或:舊期權在SELECT語句如下

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

非常感謝你救了我:) – 2012-03-26 09:27:09

+1

你非常歡迎! – GuZzie 2012-03-26 09:27:37