【发布时间】:2020-05-10 09:20:09
【问题描述】:
这里是概念模型: 在司机表中,totalTripMade 属性全部为空,但行程表包含司机进行的所有行程,所以我需要创建一个触发器,以便在行程中插入一条记录时,触发器将通过计算所有行程来更新 totalTripMade使用 l# 的行程
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;
所以驱动程序 10001 在这 3 个插入语句之前进行了 27 次行程,因为基于 l# 10001 有 27 条记录,但在每次插入之后,此代码 "DBMS_OUTPUT.PUT_LINE(:NEW.L# || ' ' | | 总行程);"一直给我 27 3 次,应该是 28、29 然后 30,请问为什么我的触发器没有正确计算行程表中基于 l# 的记录?
这是运行这些插入语句后的输出:
SQL> insert into TRIP values(109, 10001, 'SST005', sysdate );
10001 27
1 row created.
SQL> insert into TRIP values(110, 10001, 'SST005', sysdate );
10001 27
1 row created.
SQL> insert into TRIP values(111, 10001, 'SST005', sysdate );
10001 27
1 row created.
【问题讨论】:
标签: plsql triggers sqlplus database-trigger