【发布时间】:2017-05-06 01:57:18
【问题描述】:
我在酒店数据库中工作。我正在尝试创建一个触发器,该触发器将在根据当前日期是否介于房间的 check_in 和 check_out 值之间进行任何新预订之前更改房间的可用性状态。
我的编译器日志中有 2 个错误:
在“每一行”上忽略的 SQL 语句
和
ora00904:“status_in”:无效标识符
我将不胜感激。
表格:
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 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)
);
触发器:
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_id = :old.room_id;
if sysdate between :old.check_in and :old.check_out then
update room
set status_in = 'F'
where room_id = :old.room_id;
else
update room
set status_in = 'T'
where room_id = :old.room_id;
end if;
exception
when error1 then
raise_application_error(-20100,'Insert Cancelled');
end;
【问题讨论】:
-
我必须说我更喜欢特定的 Y/N 指标而不是这些模糊的状态列表。我猜
T和F的意思是TRUE和FALSE,但是TRUE是一个状态吗?将列命名为occupied_yn(和varchar2(1) not null,而我们正在使用它,加上一个只允许Y或N的检查约束)将使事情更清晰。