【问题标题】:Oracle trigger to update an entity in different tableOracle触发器更新不同表中的实体
【发布时间】:2011-12-22 14:14:06
【问题描述】:

所以这是来自一个 uni 课程,是我第一次使用 Oracle(并使用触发器)。我们应该为航空公司创建一个数据库。

部分数据库是

CREATE TABLE FLIGHT_BOOKING (
  BOOKING_ID NUMBER(11) PRIMARY KEY,
  BOOKING_TIME DATE NOT NULL,
  EMPLOYEE_ID NUMBER(11) NOT NULL,
  FLIGHT_ID NUMBER(11) NOT NULL,
  TOTAL_COST NUMBER(4,2) NOT NULL
);

CREATE TABLE FLIGHT (
  FLIGHT_ID NUMBER(11) PRIMARY KEY,
  PLANE_ID NUMBER(11) NOT NULL,
  START_ID NUMBER(11) NOT NULL,
  DESTINATION_ID NUMBER(11) NOT NULL,
  TRANSIT_ID NUMBER(11),
  DEPARTURE_TIME DATE NOT NULL,
  ARRIVAL_TIME DATE NOT NULL,
  NUM_BOOKED NUMBER (4) NOT NULL
);

CREATE TABLE PASSENGER (
  PASSENGER_ID NUMBER(11) PRIMARY KEY,
  FIRST_NAME VARCHAR2(20) NOT NULL,
  MIDDLE_NAME VARCHAR2(20) NULL,
  LAST_NAME VARCHAR2(20) NOT NULL,
  TELEPHONE NUMBER(11) NOT NULL,
  BOOKING_ID NUMBER(11) NOT NULL
);

所以我要做的是创建一个触发器,这样每次将新乘客添加到 PASSENGER 表时,触发器都会从 FLIGHT_BOOKING 表中找到相应的 FLIGHT_ID,并为 FLIGHT 表中的相应航班增加 NUM_BOOKED。

我尝试过浏览 oracle 文档,但找不到任何描述涉及两个或多个表的情况的内容。

任何帮助将不胜感激!

【问题讨论】:

    标签: oracle triggers


    【解决方案1】:

    我宁愿存储那个数字,并根据需要计算它,但是好吧,这只是课程材料。 :)

    当您创建触发器时,您可以在其中放置各种代码,包括更新语句。

    所以你可以这样写一个触发器:

    create or replace trigger TIDB_BOOKING
    before insert or delete
    for each row
    declare
      V_Increment int;
    begin
      -- Inc or dec, depending on insert or update.
      -- Hasn't a booking got a number of seats?
      -- Also, can bookings be updated/moved to other flights?
      -- These problems aren't yet taken into account in this code.
      V_Increment := 1; 
      if deleting then
        V_Increment := -1;
    
      update FLIGHT f
      set f.NUM_BOOKED = f.NUM_BOOKED + V_Increment
      where f.FLIGHT_ID = nvl(:new.FLIGHT_ID, :old.FLIGHT_ID);
    end;
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      CREATE OR REPLACE TRIGGER update_flight_booking_info
        AFTER INSERT ON PASSENGER
        FOR EACH ROW
      
      DECLARE
          v_flight_id number;
          v_booking_id number;
      BEGIN
          v_booking_id  := :new.booking_id ;
      
          select flight_id into v_flight_id
          from flight_booking
          where booking_id = v_booking_id;
      
          update flight
          set NUM_BOOKED = NUM_BOOKED + 1
          where flight_id = v_flight_id;
      END;
      

      HTH。

      【讨论】:

      • 不需要单独选择。您可以在一次更新中完成。
      • @GolezTrol:是的,你完全正确。谢了。我只是想逐步演示解决方案,这可能是有道理的。
      猜你喜欢
      • 1970-01-01
      • 2016-12-03
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      相关资源
      最近更新 更多