2017-05-07 16 views
0

我的数据库是酒店预订系统的数据库。根据当前日期是否落在房间的check_in和check_out值之间,我的触发器会在进行任何新预留之前更改房间的可用状态。触发错误:ORA-01403插入时找不到数据

我试图用insert语句触发触发器时发现错误没有数据。我希望对此问题提供任何帮助。

错误:

SQL Error: ORA-01403: no data found ORA-06512: at "USER.ROOM_STATUS", line 5 ORA-04088 error during execution of trigger 'USER.ROOM_STATUS' - no data found *Cause: No data was found from the objects

触发:

create or replace trigger room_status 
    before insert on reservation 
    for each row 
declare 
    status_in room.status%type; 
    error1 exception; 
begin 
    select status into status_in 
    from room 
    where room.room_id = :old.room_id; 
    if sysdate between :old.check_in and :old.check_out then 
    update room 
    set status = 'F' 
    where room_id = :old.room_id; 
    else 
    update room 
    set status = 'T' 
    where room_id = :old.room_id; 
    end if; 
exception 
    when error1 then 
    raise_application_error(-20100,'Insert Cancelled'); 
end; 

插入语句:

insert into reservation 
values(reservation_sequence.nextval,to_date('05-03-2017','mm/dd/yyyy'), 
to_date('05-07-2017','mm/dd/yyyy'), 116, 170); 

表:

create table roomType 
(room_type varchar2(20) constraint roomType_pk primary key, 
room_rate number(4)); 

create table room 
(room_id number(3) constraint room_pk primary key, 
room_type varchar2(15) constraint room_fk references roomType, 
status char(1)); 

create table guest 
(guest_id varchar2(5) constraint guest_pk primary key, 
first_name varchar2(20), 
last_name varchar2(20), 
email varchar2(30), 
phone varchar2(10)); 

create table reservation 
(reservation_id number(6) constraint reservation_pk primary key, 
check_in date, 
check_out date, 
room_id number(3), 
guest_id varchar2(5), 
foreign key (room_id) references room(room_id), 
foreign key (guest_id) references guest(guest_id)); 

回答

2

当SELECT语句找不到数据时,Oracle会抛出NO_DATA_FOUND错误。所以,看看你的触发器,明显的解释可能是ROOM表中没有数据。

然而,在你的触发代码个微妙的问题:应用DML之前

select status into status_in 
from room 
where room.room_id = :old.room_id; 

:old命名空间引用列的价值。但是您的DML语句是insert,所以:old.room_id的值为空,因为没有先前的记录。任何= null总是错误的,所以选择无法找到任何东西。

您需要做的是参考:new值。

select status into status_in 
from room 
where room.room_id = :new.room_id; 

:new适用于INSERT和UPDATE语句,:old适用于UPDATE和DELETE语句。


顺便说一句,你已经定义了一个例外error1,但你不养它的任何地方,这样的异常处理程序将不会执行。