触发错误:ORA-01403 插入时找不到数据

Posted

技术标签:

【中文标题】触发错误:ORA-01403 插入时找不到数据【英文标题】:Trigger error: ORA-01403 no data found on insert 【发布时间】:2017-05-07 07:01:00 【问题描述】:

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

我在尝试使用插入语句触发触发器时收到错误未找到数据。如有任何帮助,我将不胜感激。

错误:

SQL 错误:ORA-01403:未找到数据 ORA-06512: 在 "USER.ROOM_STATUS" 第 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));

【问题讨论】:

【参考方案1】:

当 SELECT 语句找不到数据时,Oracle 会抛出 NO_DATA_FOUND 错误。因此,查看您的触发器,显而易见的解释可能是您的 ROOM 表中没有数据。

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

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

:old 命名空间引用了应用 DML之前列的值。但是您的 DML 语句是 insert,因此 :old.room_id 的值为 null,因为没有先前的记录。任何= null 始终为假,因此选择无法找到任何内容。

您需要做的是引用:new 值。

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

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


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

【讨论】:

以上是关于触发错误:ORA-01403 插入时找不到数据的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作Redis

python爬虫入门----- 阿里巴巴供应商爬虫

Python词典设置默认值小技巧

《python学习手册(第4版)》pdf

Django settings.py 的media路径设置

Python中的赋值,浅拷贝和深拷贝的区别