就我刚接触SQL而言,我正在SQL Oracle中进行项目,发现一个问题。
我有一个系统在称为预订的表格中管理预订的房间。一些属性是:
我有一个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中进行项目,发现一个问题。我有一个系统可以在预订表中管理已预订的房间。一些属性是:...
还有另一种不涉及触发器的方法: