Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试创建触发器时出错(忽略无效标识符和sql)_Sql_Oracle_Plsql_Triggers - Fatal编程技术网

尝试创建触发器时出错(忽略无效标识符和sql)

尝试创建触发器时出错(忽略无效标识符和sql),sql,oracle,plsql,triggers,Sql,Oracle,Plsql,Triggers,我在一家酒店的数据库里工作。我试图创建一个触发器,根据当前日期是否介于房间的“签入”和“签出”值之间,在进行任何新预订之前更改房间的可用性状态 我的编译器日志中有2个错误: 忽略“for each row”上的SQL语句 及 ORA000904:状态_in:无效标识符 我将感谢任何帮助 表: create table room( room_id number(3) constraint room_pk primary key, room_type varchar2(15) con

我在一家酒店的数据库里工作。我试图创建一个触发器,根据当前日期是否介于房间的“签入”和“签出”值之间,在进行任何新预订之前更改房间的可用性状态

我的编译器日志中有2个错误:

忽略“for each row”上的SQL语句

ORA000904:状态_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;
update语句尝试更新文件室中的列状态。\u:

但房间里并没有那个柱子。它有一个状态列

我也不确定您在恢复旧房间状态方面的意图。你打算用它来检查什么东西吗?如果不是的话,你的触发器是否会这样做:

update room
  set status = (sysdate between :old.check_in and :old.check_out)
  where room_id = :old.room_id
;
如果是这样的话,那么您可能还会问,您是否真的希望在房间表上有一个状态列。status实际上是一个派生列。设置状态而不是计算状态会给您带来不一致的危险。相反,您可以按照以下思路做一些事情:

create table room(
    room_id number(3) constraint room_pk primary key,
    room_type varchar2(15) constraint room_fk references roomType
);
查询:

SELECT r.room_id
      ,r.room_type
      ,SUM(CASE WHEN sysdate between :old.check_in and :old.check_out THEN 1 ELSE 0 END) AS status
  FROM room r
  JOIN reservation v ON (v.room_id = r.room_id)
  GROUP BY r.room_id, r.room_type
  ;

谢谢你的回复!触发器编译得很好,但现在出现错误:01403:未找到数据。我使用此insert语句来检查:插入到保留值保留序列。下一步,到日期'05-03-2017','mm/dd/yyyy',到日期'05-07-2017','mm/dd/yyyy','107','G180'它是选择的。。。将抛出“找不到数据”异常。那么有价值107的房间吗?约束是否处于活动状态?另外,插入时不要引用数字。我必须说我更喜欢特定的Y/N指标,而不是这些模糊的状态列表。我猜T和F的意思是对的和错的,但是状态如何是真的呢?当我们在对列进行命名时,将其命名为En和varchar21不能为null,再加上一个只允许Y或N的检查约束,这将使事情更加清楚。
SELECT r.room_id
      ,r.room_type
      ,SUM(CASE WHEN sysdate between :old.check_in and :old.check_out THEN 1 ELSE 0 END) AS status
  FROM room r
  JOIN reservation v ON (v.room_id = r.room_id)
  GROUP BY r.room_id, r.room_type
  ;