Oracle 触发器错误:ORA-01403在insert上找不到数据

Oracle 触发器错误:ORA-01403在insert上找不到数据,oracle,plsql,oracle11g,triggers,Oracle,Plsql,Oracle11g,Triggers,我的数据库是一个酒店预订系统。我的触发器将根据当前日期是否介于房间的签入和签出值之间,在进行任何新预订之前更改房间的可用性状态 我在尝试使用insert语句触发触发器时遇到错误“找不到数据”。如果您能在这个问题上给予帮助,我将不胜感激 错误: SQL错误:ORA-01403:未找到任何数据 ORA-06512:“用户房间”状态,第5行 ORA-04088执行触发器“USER.ROOM_STATUS”时出错-未找到数据 *原因:未从对象中找到任何数据 触发: create or replace t

我的数据库是一个酒店预订系统。我的触发器将根据当前日期是否介于房间的签入和签出值之间,在进行任何新预订之前更改房间的可用性状态

我在尝试使用insert语句触发触发器时遇到错误“找不到数据”。如果您能在这个问题上给予帮助,我将不胜感激

错误:

SQL错误:ORA-01403:未找到任何数据 ORA-06512:“用户房间”状态,第5行 ORA-04088执行触发器“USER.ROOM_STATUS”时出错-未找到数据 *原因:未从对象中找到任何数据

触发:

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));

当SELECT语句找不到数据时,Oracle会抛出“找不到数据”错误。所以,看看你的触发器,显而易见的解释可能是你的房间桌子上没有数据

但是,触发器代码中有一个微妙的错误:

select status into status_in
from room
where room.room_id = :old.room_id;
:old
命名空间在应用DML之前引用列的值。但是您的DML语句是一个
insert
,因此
:old.room_id
的值为空,因为没有先前的记录。任何
=null
都始终为false,因此select无法找到任何内容

您需要做的是引用
:new

select status into status_in
from room
where room.room_id = :new.room_id;
:new
适用于插入和更新语句,
:old
适用于更新和删除语句



顺便说一句,您已经定义了一个异常
error1
,但并没有在任何地方引发它,所以异常处理程序将永远不会执行

当SELECT语句找不到数据时,Oracle会抛出“找不到数据”错误。所以,看看你的触发器,显而易见的解释可能是你的房间桌子上没有数据

但是,触发器代码中有一个微妙的错误:

select status into status_in
from room
where room.room_id = :old.room_id;
:old
命名空间在应用DML之前引用列的值。但是您的DML语句是一个
insert
,因此
:old.room_id
的值为空,因为没有先前的记录。任何
=null
都始终为false,因此select无法找到任何内容

您需要做的是引用
:new

select status into status_in
from room
where room.room_id = :new.room_id;
:new
适用于插入和更新语句,
:old
适用于更新和删除语句


顺便说一句,您已经定义了一个异常
error1
,但并没有在任何地方引发它,所以异常处理程序将永远不会执行