这里是概念模型。在driver表中, totalTripMade属性都是空的, 但是trip表中包含了所有driver所做的行程, 所以我需要创建一个触发器,当一个记录被插入到trip中时, 触发器会通过计算所有行程来更新totalTripMade。
create or replace trigger updateTrip
AFTER INSERT
on TRIP
for each row
declare
PRAGMA AUTONOMOUS_TRANSACTION;
totalTrips number;
begin
UPDATE DRIVER
SET TOTALTRIPMADE = (SELECT COUNT(L#) FROM TRIP WHERE L# =:NEW.L#)
WHERE L#=:NEW.L#;
SELECT COUNT(L#) into totalTrips FROM TRIP WHERE L# =:NEW.L#;
DBMS_OUTPUT.PUT_LINE(:NEW.L# || ' ' || totalTrips);
commit;
end;
/
SHOW ERRORS;
select * from DRIVER;
--
insert into TRIP values(109, 10001, 'SST005', sysdate );
insert into TRIP values(110, 10001, 'SST005', sysdate );
insert into TRIP values(111, 10001, 'SST005', sysdate );
--
select * from DRIVER;
select * from TRIP;
所以在这3条插入语句之前,司机10001已经跑了27趟,因为根据l#10001有27条记录,但每次插入后,这条代码 "DBMS_OUTPUT.PUT_LINE(:NEW.L#)