根据同一表中的其他数据验证插入的数据(Oracle)

问题描述 投票:3回答:1

就我刚接触SQL而言,我正在SQL Oracle中进行项目,发现一个问题。

我有一个系统在称为预订的表格中管理预订的房间。一些属性是:

  • room_id
  • 到达日期
  • nights_nr
  • booking_id(即PK)。

我有一个UNIQUE(room_id,到达日期)约束。

要拥有一个连贯的数据库,我需要检查每个插入或更新的行,是否已经预定了该房间的预定预定天数。这是基于表的值的约束,我需要一个选择,因此我无法在CHECK中执行此操作(或者至少我还没有弄清楚另一种可能性)。

我正在尝试使用触发器,但这是我第一次接触触发器。

[我原以为可以选择一个时间,并验证我打算更新的另一个Booking_id和同一个room_id是否与预定范围相交。]

由于缺乏知识,我写了这样的东西:

CREATE OR REPLACE TRIGGER validate_free_room
BEFORE INSERT OR UPDATE OF arrival_date, night_nr ON bookings
FOR each row
DECLARE a char(8)
DECLARE b char(3)
SET a=booking_id
SET b=room_id
WHEN EXISTS (
    SELECT booking_id
    FROM bookings r
    WHERE 
    (r.booking_id!=a 
     AND 
     ((arrival_date BETWEEN r.arrival_date AND r.arrival_date + nights_nr)
      OR
      (arrival_date + nights_nr BETWEEN r.arrival_date AND r.arrival_date + r.nights_nr)
      )
     AND
     b=r.room_id
    )
   )
BEGIN
    RAISE_APPLICATION_ERROR (-20107,'Room already booked')
         end;

我刚刚发现我无法在用“每行”修改的表中执行选择。

您有任何想法,我如何才能正确地做到这一点? (我知道先例行是一场彻底的灾难。)

我正在使用Oracle Aplication Express,它给了我以下错误建议:

ORA-24344: success with compilation error
ORA-06512: at "SYS.WWV_DBMS_SQL_APEX_190200", line 592
ORA-06512: at "SYS.DBMS_SYS_SQL", line 1658
ORA-06512: at "SYS.WWV_DBMS_SQL_APEX_190200", line 578
ORA-06512: at "APEX_190200.WWV_FLOW_DYNAMIC_EXEC", line 2057


3. for each row
4. declare a char(8)
5. declare b char(3)
6. set a=id_rezerva
7. set b=id_camera

Error computing plan for statement.
ORA-00900: invalid SQL statement

非常感谢!

据我刚开始使用SQL时,我正在SQL SQL Oracle中进行项目,发现一个问题。我有一个系统可以在预订表中管理已预订的房间。一些属性是:...

sql oracle plsql oracle-apex database-trigger
1个回答
2
投票

还有另一种不涉及触发器的方法:

© www.soinside.com 2019 - 2024. All rights reserved.