PL/SQL ORACLE:删除时触发更新
Posted
技术标签:
【中文标题】PL/SQL ORACLE:删除时触发更新【英文标题】:PL/SQL ORACLE: Trigger updates on delete 【发布时间】:2017-11-25 00:14:44 【问题描述】:我正在尝试创建一个触发器,以增加预订值并减少可用值,只要将新记录插入到 table_price 中。如果删除了一条记录,我希望它减少预订价值并增加可用价值。
虽然我能够成功地使触发器为 INSERT 工作,但我无法在删除记录时更新值。这是我尝试删除记录时遇到的错误
ORA-01403: no data found
ORA-06512: at "K.CAL", line 6
ORA-04088: error during execution of trigger 'K.CAL'
澄清一下,我正在更新另一个表中的值,而不是我要删除的同一个表!
这是我的触发器代码:
CREATE OR REPLACE TRIGGER cal
BEFORE INSERT OR DELETE ON TICKET_PRICE FOR EACH ROW
DECLARE
V_TICKET TICKET_PRICE.TICKETPRICE%TYPE;
V_BOOKED FLIGHTSEAT.BOOKED_SEATS%TYPE;
V_AVAILABLE FLIGHTSEAT.AVAILABLE_SEATS%TYPE;
BEGIN
SELECT BOOKED_SEATS,AVAILABLE_SEATS
INTO V_BOOKED,V_AVAILABLE
FROM FLIGHTSEAT
WHERE SEAT_ID=:NEW.SEAT_ID;
IF INSERTING THEN
V_BOOKED:=V_BOOKED+1;
V_AVAILABLE:=V_AVAILABLE-1;
UPDATE FLIGHTSEAT
SET BOOKED_SEATS=V_BOOKED, AVAILABLE_SEATS=V_AVAILABLE
WHERE SEAT_ID=:NEW.SEAT_ID;
ELSIF DELETING THEN
V_BOOKED:=V_BOOKED-1;
V_AVAILABLE:=V_AVAILABLE+1;
UPDATE FLIGHTSEAT
SET BOOKED_SEATS=V_BOOKED, AVAILABLE_SEATS=V_AVAILABLE
WHERE SEAT_ID=1;
END IF;
END;
【问题讨论】:
【参考方案1】:您已经正确地推测 :new.seat 在更新中不可用于删除。但它也不适用于选择,你知道 sea_id=1 需要更新吗?对于已删除行数据的参考,请使用 :Old.column name;这种情况下是否使用 :old_seat_id 进行选择和更新。
但您根本不需要选择。注意:此外,您还有一个隐含的假设,即 seat_id 是唯一的。我会在下面接受。
create or replace trigger cal
before insert or delete on ticket_price
for each row
declare
v_seat_id flightseat.seat_id%type;
v_booked flightseat.booked_seats%type;
begin
if INSERTING then
v_booked := 1;
v_seat_id := :new.seat_id;
else
v_booked := -1;
v_seat_id := :old.seat_id;
end if;
update flightseat
set booked_seats=booked_seats+v_booked
, available_seats=available_seats-v_booked
where seat_id = v_seat_id;
end;
【讨论】:
很抱歉,我认为我没有很好地解释自己。我的意思是,这些值将被添加到另一个名为 flighteat 的表中。所以是的,我认为我有点需要选择 如果其他表的航班座位您不需要先从中选择。所以 update ... set col = col + incr 并选择 col ... into var; var = var + inct;更新...设置 col - var;两者产生完全相同的结果。以上是关于PL/SQL ORACLE:删除时触发更新的主要内容,如果未能解决你的问题,请参考以下文章