我有以下DML语句正常工作,我试图将其变成触发器,但它无效。
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 :(得分:3)
查询中没有为R设置别名。
您应该在select语句中使用:NEW或:OLD选项,如下所示
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;