#oracle #date #triggers #compare
#Oracle #Дата #запускает #Сравнить
Вопрос:
итак, я создаю базу данных Oracle для моей университетской курсовой работы по авиакомпании. Теперь у меня есть таблица под названием staff_allocations, которая распределяет персонал для рейсов в таблице рейсов.
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.
приветствия.
Ответ №1:
Первая проверка довольно проста. Если вам известны отправление и посадка изменяемого рейса, вы можете проверить, существует ли другой рейс для сотрудника, дата и время прибытия которого больше даты вылета текущего рейса, а дата и время вылета этого рейса предшествуют дате и времени прибытия текущего рейса.
Если такой рейс существует, он совпадает с вашим текущим рейсом. Но в этом больше логики, чем в Oracle.
Другая проверка сложнее (для базы данных). Вам нужно будет найти последнее прибытие для конкретного сотрудника и выбрать страну прибытия в качестве страны, в которую прибывает сотрудник. Обратите внимание, что это гипотетически. Кто-то мог отправиться домой в качестве пассажира или на автобусе. Кроме того, вам нужно будет убедиться, что у вас есть отправная точка для каждого сотрудника. Таким образом, либо вам придется разрешить все для чьего-либо первого полета, либо вам придется регистрировать страну у самого сотрудника. Последнее решение не очень хорошо «перемещается во времени», это всего лишь фиксированное местоположение, и оно не сообщает, где сотрудник будет находиться в определенную дату. Поэтому я бы просто разрешил любое распределение для новых сотрудников и не беспокоился об остальном для этого назначения.
Основная проблема, с которой вы столкнетесь, заключается в том, что вы не можете запросить таблицу в триггере уровня строки в этой же таблице. Итак, чтобы это сработало, вам нужно будет запомнить вставленные записи и написать уровень таблицы после триггера insert для выполнения проверки.
Я бы с удовольствием дал вам какой-нибудь код, но люди продолжают говорить мне, что студенты должны делать свои собственные. Итак, я оставляю реализацию вам, а сам собираюсь сделать свою домашнюю работу. 🙂
Ответ №2:
Я думаю, вы знаете о синтаксисе триггера и pl / sql.
Я советую вам проверить dbms_output.put_line, чтобы помочь отладить ваш триггер, или использовать инструмент, который поддерживает пошаговые указания.
Если вы хотите переборщить (каламбур почти не предназначен), вам следует проверить, начинаются ли уже существующие распределения рейсов, начинающиеся после того, который вы вставляете, в стране, куда прибывает введенный, иначе это аннулирует 3 рейса.
Вы хотите вставить рейс B. Рейс A отправляется из США в Мексику, рейс C отправляется из Мексики в США. Затем вы вставляете рейс B из Мексики в Гватемалу. Это допустимо, но прерывает полет C.
удачного полета.