所以我正在为航空公司的大学课程创建一个oracle数据库。现在我有一个名为staff_allocations的表,它为Flight表中的航班分配人员。
CREATE TABLE FLIGHT (
FLIGHT_ID NUMBER(11) PRIMARY KEY,
ROUTE_ID NUMBER(11) NOT NULL,
PLANE_ID NUMBER(11) NOT NULL,
PILOT_ID NUMBER(11) NOT NULL,
DEPARTURE_TIME TIMESTAMP NOT NULL,
ARRIVAL_TIME TIMESTAMP NOT NULL,
FREE_SEATS NUMBER (4)
);
CREATE TABLE STAFF_ALLOCATION (
FLIGHT_ID NUMBER(11) NOT NULL,
EMPLOYEE_ID NUMBER(11) NOT NULL
);
现在航班表中的route_id引用路线表。
CREATE TABLE ROUTE (
ROUTE_ID NUMBER(11) PRIMARY KEY,
START_ID VARCHAR2(3) NOT NULL,
DESTINATION_ID VARCHAR2(3) NOT NULL,
TRANSIT_ID VARCHAR2(3),
IS_ACTIVE VARCHAR2(1),
DISTANCE NUMBER (8,2),
BASE_PRICE NUMBER (6,2)
);
其中start id,destination id和transit id都指向不同的机场代码(LHR,HAM等)
所以我试图制作一个触发器,在插入到staff_allocation之前计算出来,是否将工作人员分配给另一个时间与新时间重叠的航班。此外,还必须检查工作人员是否实际上与航班起源位于同一国家。
这样的事情:
查找已分配给工作人员的航班。 将新航班起飞时间与现有航班起飞时间进 如果航班时间没有冲突,那么看看员工是否已经在新的start_id
的国家/地区任何人都可以帮我解决任何示例代码或指向我正确的方向我应该看/使用什么?这是我第一次用oracle创建任何东西。
欢呼声。
答案 0 :(得分:1)
第一次检查非常简单。如果您知道您正在修改的航班的起飞和降落,您可以检查该员工是否有另一航班,其抵达日期时间大于当前航班的起飞时间,该航班的起飞日期时间为在当前航班到达日期之前。
如果存在此类航班,则会与您当前的航班重叠。但这比甲骨文更具逻辑性。
另一项检查更难(对于数据库)。您必须找到特定员工的最新抵达,并选择抵达国家作为员工到达的国家/地区。 请注意,这是假设的。有人可以作为乘客或公共汽车回家。此外,您需要确保每个员工都有一个起点。因此,要么您必须允许某人第一次飞行,或者您必须向该员工本身注册该国家/地区。后一种解决方案并非“时间旅行”,它只是一个固定的位置,并不能告诉员工在某个特定日期的位置。因此,我只允许对新员工进行任何分配,并且不要为此任务而烦恼。
您将面临的主要问题是,您无法在同一个表的行级触发器中查询表。因此,为了解决这个问题,您必须记住插入的记录并在插入触发器之后写一个表级别来进行检查。
我很想给你一些代码,但人们一直告诉我学生应该自己做。所以我会把实施留给你,而我会做自己的功课。 :)
答案 1 :(得分:-1)
我想你知道触发器语法和pl / sql。
我建议您检查dbms_output.put_line以帮助调试触发器,或使用支持步骤点的工具。
如果你想过火(双关语几乎没有意图),你应该检查在你插入的航班之后开始的已经存在的航班分配是否在插入的国家到达的国家开始,否则它将使3航班无效。
你想要插入航班B.航班A从美国飞往墨西哥,航班C从墨西哥飞往我们。然后你插入B航班,从墨西哥到危地马拉。这是有效的,但会打破C航班。
良好的飞行。