Oracle触发器更新不同表中的实体

Oracle触发器更新不同表中的实体,oracle,triggers,Oracle,Triggers,这是我第一次与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

这是我第一次与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
);
所以我要做的是创建一个触发器,这样每当一个新的乘客被添加到乘客表中时,触发器就会从FLIGHT_BOOKING表中找到相应的FLIGHT_ID,并增加FLIGHT表中相应航班的NUM_BOOKED

我曾尝试浏览oracle文档,但找不到任何描述两个或多个表相关情况的内容

任何帮助都将不胜感激

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

当您创建一个触发器时,您可以在其中放入各种代码,包括update语句

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

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;
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;

您可以这样做:

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;
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:是的,你完全正确。Tks。我只是想一步一步地演示解决方案,这可能是有意义的。