
1 / 5
.docx
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
федеральное государственное автономное образовательное учреждение высшего образования
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»
Кафедра 41
ПРЕПОДАВАТЕЛЬ
Доцент, канд. техн. наук |
|
|
|
Е. Л. Турнецкая |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
Лабораторная работа №5
Программная реализация хранимых процедур
по курсу: Базы данных
СТУДЕНТКА ГР. № |
Z0411 |
|
13.05.23 |
|
М. В. Карелина |
|
|
номер группы |
|
подпись, дата |
|
инициалы, фамилия |
Номер студенческого билета: 2020/3477
Санкт-Петербург
2023
Цель работы:
программная реализация хранимых процедур на сервере.
Порядок выполнения работы
1. Используйте реализованную по индивидуальному заданию БД
2. Реализуйте от одной до трех хранимых процедур, используя глобальные переменные и операторы ветвления. Опишите программную реализацию с использованием алгоритмических конструкций.
3. Разработайте от одной до трех хранимых процедур, используя различные типы параметров и циклы. Опишите программную реализацию с использованием алгоритмических конструкций.
4. Протестируйте каждую реализованную процедуру с помощью позитивных и негативных тестов, т.е. подавая на вход различные значения параметров: правильных, при которых подпрограмма будет возвращать корректный результат, и изначально неправильные, при которых подпрограмма не может функционировать.
5. Покажите список всех хранимых процедур в БД.
6. Выполните отчет в соответствие с требованиями ГОСТ 7.32-2017 и ГОСТ 2.105-2019: по оформлению отчетов (https://guap.ru/standart/doc).
Вариант 8
Обслуживание рейсов в аэропорту
Аэропорт обслуживает рейсы разных авиакомпаний. У каждой авиакомпании есть несколько рейсов. Авиакомпании предоставляют самолеты различного типа (вместимости). Самолеты характеризуются типом, годом выпуска, количеством мест и фирмой-производителем. В один город могут быть несколько рейсов в разное время, осуществляемых различными авиакомпаниями. Самолеты обслуживаются экипажем: 27 командир корабля, второй пилот, штурман, бортинженер и стюардессы. О сотрудниках хранится следующая информация: Ф.И.О., должность, квалификация, экипаж. Рейс имеет свой номер, пункт отправления, пункт прибытия, время вылета, время в пути, тип самолета, название авиакомпании, обслуживающей данный рейс. Билет на самолет имеет свой номер и № рейса, ФИО пассажира, № места, стоимость, дата продажи, дата бронирования. Пассажир, приобретая билет на самолет, сообщает о себе паспортные данные. Клиент может забронировать билет по Интернету и выкупить его за 3 часа до вылета.
В данной лабораторной работе будет использована модель данных, спроектированная в прошлых работах (Рис. 1).
Рисунок 1 - Модель данных в среде MySQL Workbench
Хранимая процедура (stored procedure) – подпрограмма (возможно, параметризованная) предназначенная для выполнения ряда операций с данными и структурами базы данных, хранимая на стороне базы данных и доступная как для вызова из кода других процедур и триггеров, так и для непосредственного исполнения.
Требуется оформить запрос на добавление нового пассажира в виде процедуры: для каждого вводимого параметра необходимо задать переменную и определить ее формат. Для рассматриваемого примера будут определены переменные PassID INT, FIO VARCHAR(45), Passport VARCHAR(45),. Чтобы выполнить процедуру полностью переопределяют разделитель команд с «;» на «//» оператором DELIMETER.
Листинг. Процедура NPass.
DELIMITER //
/*Тело процедуры*/
CREATE PROCEDURE NPass(PassID INT, FIO VARCHAR(45), Passport VARCHAR(45))
begin
INSERT into `пассажиры` (`№ Пассажира`,`Ф.И.О.`,`Паспортные данные`)
value (PassID, FIO, Passport);
end
//
Проверка:
CALL NPass (11, 'Исаева Василиса Алексеевна', '1111 000000') //
Рисунок 2 - Выполнение процедуры NPass
Для перехода к новым командам потребуется возвращение к разделителю команд «;» командой:
DELIMITER ;
Следующая процедура будет необходима для вычисления скидки. В таблице Билет указана «голая» стоимость. Анализируя клиентскую базу, а также успехи авиакомпании за определенный период времени были выведены три коэффициента: 1- скидка 10% предоставляется клиентам, купившим билет в определенный период времени, 2- скидка 15% предоставляется постоянным клиентам и 3- скидка 20% предоставляется корпоративным клиентам. Коэффициент вводится вручную. Создадим такую таблицу, далее она будет использоваться постоянно. Процедура будет реализована с использованием коэффициента – глобальной переменной @x и оператором ветвления IF – ELSEIF - END IF.
Создание таблицы Bonus:
USE `аэропорт`;
CREATE TABLE `аэропорт`.`Скидка` (`№ Билет` INT, `Дата приобретения` date, `Стоимость` INT);
Перенос данных из таблицы Билет в таблицу Bonus:
USE аэропорт;
INSERT INTO `bonus`
SELECT `№ билет`, `Дата приобретения`, `Стоимость`
FROM `Билет`
Рисунок 3- Первоначальный вид таблицы Bonus
Листинг. Процедура Bonus.
DELIMITER $$
CREATE PROCEDURE Bonus (i INT)
BEGIN
/*Обновление данных в таблице*/
DELETE FROM `bonus`;
INSERT INTO `bonus` (`№ билет`, `Дата приобретения`, `Стоимость`)
SELECT
`№ билет` AS `№ билет`,
`Дата приобретения` AS `Дата приобретения`,
`Стоимость` AS `Стоимость`
FROM `билет`;
/*Операторы ветвления*/
IF (i = 1) THEN
set @x = 0.8;
ELSEIF (i = 2) THEN
set @x = 0.85;
ELSEIF (i = 3) THEN
set @x = 0.9;
ELSE
SELECT('Ошибка') AS Результат;
END IF;
UPDATE `bonus` SET `Стоимость` = `Стоимость` * @x;
END $$
Проверка:
DELIMITER ;
CALL Bonus (2);
SELECT * FROM `bonus`;
Таблица Bonus создалась, результат вывода корректный на разных данных (Рис. 4-6).
Рисунок
4 - Процедура bonus
Рисунок 3 - Процедура bonus
Рисунок 6 - Процедура bonus
Для заполнения таблицы Билет была создана хранимая процедура, которая автоматически на основе случайной генерации заполнит таблицу с турами.
Входным параметром процедуры является количество записей для вставки в таблицу – num типа INT.
Первый шаг — это объявление переменной i, которая позволит реализовать цикл WHILE по количеству записей для вставки. То есть на каждом шаге цикла для каждой новой записи будут генерироваться следующие случайные данные для заполнения:
№ Билета, № Рейса, № Пассажира, № Места, Стоимость, Дата приобретения и Дата бронирования.
Рисунок 7 – Первоначальный вид таблицы Билет
Листинг. Процедура ins_ss.
use аэропорт;
drop procedure if exists ins_ss;
DELIMITER $$
CREATE PROCEDURE ins_ss(in num int)
BEGIN
DECLARE i int DEFAULT 0;
IF (num >= 1) THEN
# получение максимальной даты и кода билета из таблицы билет
SET @date0 = DATE_FORMAT((SELECT max(`Дата приобретения`) FROM `билет`), '%Y-%m-%d');
SET @date00 = DATE_FORMAT((SELECT max(`Дата бронирования`) FROM `билет`), '%Y-%m-%d');
SET @deal_id0 = (SELECT max(`№ Билет`) FROM `билет`);
# начало цикла
WHILE i < num DO
SET @date1 = DATE_ADD(@date0, INTERVAL ROUND(RAND()* 2) DAY);
SET @date11 = DATE_ADD(@date0, INTERVAL ROUND(RAND()* 3) DAY);
SET @deal_id1 = 1 + @deal_id0;
# определение переменных с помощью рандома
SET @r_id = FLOOR(RAND()*(SELECT
max(`№ Рейс`) FROM `рейс`)+ 1);
SET @client_id = FLOOR(RAND()*(SELECT
max(`№ Пассажира`) FROM `пассажиры`)+ 1);
SET @set_id = round(rand()*(30)+1);
SET @price = ROUND(RAND()*(10000)+ 5000);
# вставка в таблицу билет
INSERT INTO `билет` (`№ Билет`,`№ Рейса`,`№ Пассажира`,`№ Места`,`Стоимость`,`Дата приобретения`,`Дата бронирования`)
VALUES (@deal_id1, @r_id, @client_id, @set_id,
@price, @date1,@date11);
# Дата и код белета, которые были вставлены в таблицу, становятся точками отсчета
SET @date0 = @date1;
SET @date00 = @date11;
SET @deal_id0 = @deal_id1;
# счетчик цикла
SET i = i + 1;
END WHILE;
ELSE
SELECT('Введите целое число больше или равное единице') AS Результат;
END IF;
END
$$
Проверка:
CALL ins_ss(5);
SELECT * FROM `билет`;
CALL ins_ss(0);
SELECT * FROM `билет`;
Рисунок 4 - Проверка процедуры ins_ss
Для просмотра реализованных в БД процедур применяют команду (Рис. 9):
SHOW PROCEDURE STATUS;
Рисунок 9 - Список процедур на сервере
Вывод
В ходе выполнения данной лабораторной работы были изучены возможности хранимых процедур и реализованы три экземпляра на сервере, которые могут пригодиться при работе в этой предметной области – Аэропорт, например, процедура, которая вставляет нового пассажира в таблицу, процедура, которая подсчитывает скидку с учетом различных параметров с помощью оператора ветвления IF, и процедура, которая заполняет таблицу Билет с помощью циклов.
Созданные процедуры были проверены как на «правильных», так и на «неправильных» параметрах.
Ознакомилась с возможностями по переносу данных и по их удалению.
Особых проблем при выполнении данных работ не возникло.