Oracle在另一个表中触发更新

时间:2011-11-12 21:56:24

标签: database oracle triggers oracle11g

我正在尝试在Oracle中创建触发器。我知道sql但我以前从未创建过触发器。我有这段代码:

create or replace trigger "PASSENGER_BOOKING_T1"
AFTER
insert on "PASSENGER_BOOKING"
for each row
begin
IF (:NEW.CLASS_TYPE == 'ECO')

SELECT F.AVL_SEATS_ECOCLASS,F.FLIGHT_ID INTO SEAT, FLIGHT_INFO 
FROM BOOKING B, JOURNEY_FLIGHT J, FLIGHT F 
WHERE B.JOURNEY_ID = J.JOURNEY_ID and F.FLIGHT_ID = J.FLIGHT_ID;

UPDATE FLIGHT 
SET AVL_SEATS_ECOCLASS = (SEAT-1)
WHERE FLIGHT_ID = FLIGHT_INFO;

END IF;
end;​

当Passenger_Booking表中有插入时,将触发此触发器。座位容量减少一个(在不同的桌子上)。

选择查询应该没问题,但某处有问题。 有人可以提出什么建议吗?

我将身体部位更改为此但仍有问题:

UPDATE FLIGHT 
SET AVL_SEATS_ECOCLASS =
  (SELECT F.AVL_SEATS_ECOCLASS FROM BOOKING B, JOURNEY_FLIGHT J, FLIGHT F WHERE B.JOURNEY_ID = J.JOURNEY_ID and F.FLIGHT_ID = J.FLIGHT_ID;
);

2 个答案:

答案 0 :(得分:4)

  1. IF语句需要THEN
  2. 在PL / SQL中,您使用=来测试相等性,而不是==
  3. 您需要声明要选择的变量
  4. 当我做这三件事时,我会得到类似的东西

    create or replace trigger PASSENGER_BOOKING_T1
      AFTER insert on PASSENGER_BOOKING
      for each row
    declare
      l_seat       flight.seat%type;
      l_flight_id  flight.flight_id%type;
    begin
      IF (:NEW.CLASS_TYPE = 'ECO')
      THEN
        SELECT F.AVL_SEATS_ECOCLASS,F.FLIGHT_ID 
          INTO l_seat, l_flight_id
          FROM BOOKING B, 
               JOURNEY_FLIGHT J, 
               FLIGHT F 
         WHERE B.JOURNEY_ID = J.JOURNEY_ID 
           and F.FLIGHT_ID = J.FLIGHT_ID;
    
        UPDATE FLIGHT 
           SET AVL_SEATS_ECOCLASS = (l_seat-1)
         WHERE FLIGHT_ID = l_flight_id;   
      END IF;
    end;​
    

    除了那些语法错误之外,如果SELECT INTO语句是正确的,我会感到震惊。 SELECT INTO必须返回1行。您的查询几乎肯定会返回多行,因为没有谓词会限制查询到特定航班或特定预订。据推测,您希望加入PASSENGER_BOOKING表中的一个或多个列。

    此外,如果这不是作业分配,请确保您了解此类触发器在多用户环境中无法正常工作。

答案 1 :(得分:1)

只是一个狂野的猜测

Justin指出(感谢Justin)平等检查

编辑

create or replace trigger "PASSENGER_BOOKING_T1"
AFTER
insert on "PASSENGER_BOOKING"
for each row
declare
   v_flight_id  FLIGHT.FLIGHT_ID%TYPE;
begin
IF (:NEW.CLASS_TYPE = 'ECO') THEN

SELECT F.ID into v_flight_id
FROM BOOKING B, JOURNEY_FLIGHT J, FLIGHT F 
WHERE B.ID = :NEW.BOOKING_ID -- note that I've made this up
AND B.JOURNEY_ID = J.JOURNEY_ID AND F.FLIGHT_ID = J.FLIGHT_ID;

UPDATE FLIGHT 
SET AVL_SEATS_ECOCLASS = (SEAT-1)
WHERE ID = v_flight_id;

END IF;
end;​