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:删除时触发更新的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 触发器更新或删除

更新同一表中的值的 PL/SQL 插入和删除触发器

ORACLE PL/SQL 触发器的编程问题

pl/sql 触发器完整性约束问题

使用 PL\SQL Developer 7.0.2 调试 Oracle 触发器?

如何创建在 PL/SQL 中更新后触发的触发器