оракул найти, где дата попадает в список - PullRequest
0 голосов
/ 13 ноября 2011

, поэтому я создаю базу данных оракула для своей университетской курсовой работы в авиакомпании. Теперь у меня есть таблица с именем 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)   
);

где начальный идентификатор, конечный идентификатор и идентификатор транзита указывают на разные коды аэропортов (LHR, HAM и т. Д.)

поэтому я пытаюсь создать триггер, который до вставки в staff_allocation определит, будет ли персонал выделен для другого рейса, время которого совпадает с новым. Кроме того, он должен проверить, действительно ли персонал находится в той же стране, что и источник полета.

так что-то вроде этого:

найти, на кого уже назначен сотрудник, выполняющий рейсы. сравнить время вылета нового рейса с существующим временем вылета рейса. если время полета не совпадает, посмотрите, находится ли штат в стране нового start_id

Может ли кто-нибудь помочь мне с примером кода или указав мне правильное направление в том, что я должен смотреть / использовать? я впервые создаю что-то с помощью Oracle.

ура.

Ответы [ 2 ]

1 голос
/ 13 ноября 2011

Первая проверка довольно проста. Если вы знаете, что отправление и посадка изменяемого вами рейса выполняются, вы можете проверить, существует ли для сотрудника другой рейс, дата прибытия которого больше даты вылета текущего рейса, а дата вылета этого рейса до даты прибытия время текущего рейса.

Если такой рейс существует, он совпадает с вашим текущим рейсом. Но это более логично, чем Oracle.

Другая проверка сложнее (для базы данных). Вам нужно будет найти последнее прибытие для конкретного сотрудника и выбрать страну прибытия в качестве страны прибытия сотрудника. Обратите внимание, что это гипотетически. Кто-то мог пойти домой как пассажир или на автобусе. Кроме того, вам необходимо убедиться, что у вас есть отправная точка для каждого сотрудника. Таким образом, либо вам придется разрешить все для первого полета, либо вам нужно будет зарегистрировать страну у самого сотрудника. Последнее решение не очень хорошо «путешествует во времени», это только фиксированное местоположение, и оно не говорит, где сотрудник будет находиться в определенную дату. Так что я бы просто разрешил выделять новые сотрудники, и не стал бы беспокоиться об остальном для этого назначения.

Основная проблема, с которой вы столкнетесь, заключается в том, что вы не можете запросить таблицу в триггере уровня строки для этой же таблицы. Таким образом, чтобы это сработало, вам нужно будет запомнить вставленные записи и записать уровень таблицы после триггера вставки, чтобы выполнить проверку.

Я бы хотел дать вам некоторый код, но люди продолжают говорить мне, что студенты должны делать свое дело. Поэтому я оставлю выполнение вам, пока я собираюсь сделать свою домашнюю работу. :)

0 голосов
/ 13 ноября 2011

Я думаю, вы знаете о синтаксисе триггера и pl / sql.

Я советую вам проверить dbms_output.put_line, чтобы помочь отладить ваш триггер, или использовать инструмент, который поддерживает точки шага.

Если вы хотите пойти за борт (каламбур почти не предназначен), вам следует проверить, если уже существующее распределение рейсов начинается после того, как тот, который вы вводите, начинается в стране, куда прибывает тот, который был вставлен, иначе это аннулирует 3 рейса.

Вы хотите вставить рейс B. Рейс А идет из США в Мексику, рейс С идет из Мексики в Нас. Затем вы вводите рейс B из Мексики в Гватемалу. Это действительно, но нарушает рейс C.

хорошего полета.

...