
БД 3 курс осень / БД6
.docxГУАП
КАФЕДРА № 41
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
Ассистент |
|
|
|
Б.К.Акопян |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №6 |
ПРОГРАММНАЯ РЕАЛИЗАЦИЯ ХРАНИМЫХ ПРОЦЕДУР |
по курсу: БАЗЫ ДАННЫХ |
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ гр. № |
4116 |
|
|
|
|
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2023
Цель работы: программная реализация хранимых процедур на сервере.
Вариант 21.
Организация спортивного мероприятия
В Гуапландии любят спорт. Спортивная инфраструктура страны представлена спортивными сооружениями различного типа: спортивные залы, манежи, стадионы, корты и т.д. Каждая из категорий спортивных сооружений обладает атрибутами, специфичными только для нее: стадион характеризуется вместимостью, корт – типом покрытия. Гуапчане-спортсмены под руководством тренеров занимаются отдельными видами спорта, при этом один и тот же спортсмен может заниматься несколькими видами спорта, и в рамках одного и того же вида спорта может тренироваться у нескольких тренеров. Все спортсмены объединяются в спортивные клубы, при этом каждый из них может выступать только за один клуб. Организаторы соревнований проводят состязания по отдельным видам спорта на спортивных сооружениях города. По результатам участия спортсменов в соревнованиях производится награждение.
Ход работы:
Модель данных из прошлой лабораторной работы открыта в формате .mwb (рисунок 1)
Рисунок 1- модель данных
Реализована хранимая процедура training_time, которая принимает на вход код тренера и по времени из столбца «дата» (таблица «тренировки») выводит в какую часть дня у него тренировка: «раннее утро», «дневное время», «вечер». Переменная global_result является глобальной. Training_time хранит время тренировки, для определения времени дня используются условные операторы. С помощью CALL выполняется вызов процедуры (рисунок 3,4)
Рисунок 1- таблица «тренировки»
Рисунок 2- таблица «тренеры»
Листинг. Процедура определения времени тренировки тренера
DELIMITER
CREATE PROCEDURE training_time(IN код_тренера INT)
BEGIN
-- объявление переменной для времени
DECLARE training_time TIME;
-- извлечение времени и сохранение его в переменную
SELECT TIME(т.дата) INTO training_time
FROM тренировки AS т
WHERE т.код_тренера = код_тренера
ORDER BY т.дата
LIMIT 1;
IF training_time > '08:00:00' AND training_time < '12:00:00' THEN
SET @global_result = 'Раннее утро';
ELSEIF training_time >= '12:00:00' AND training_time < '16:00:00' THEN
SET @global_result = 'Дневное время';
ELSE
SET @global_result = 'Вечер';
END IF;
SELECT тренеры.код_тренера, имя, фамилия, @global_result AS Время_тренировки, time(тренировки.дата) as время
FROM тренеры
JOIN тренировки ON тренеры.код_тренера = тренировки.код_тренера
WHERE тренировки.код_тренера = код_тренера;
END;
//
DELIMITER ;
CALL training_time(1);
Рисунок 3- выполнение процедуры training_time для тренера с кодом 1
Рисунок 4- выполнение процедуры training_time для тренера с кодом 6\
Далее реализована процедура, которая принимает на вход код спортсмена и тип вида спорта. По таблице соревнования процедура проверяет есть ли подходящие соревнования для спортсмена по выбранному виду спорта, если есть, выводит информацию о спортсмене и соревновании, если нет- выводит сообщение. Чтобы соревнование подошло, дата соревнования должна быть позже сегодняшней даты. Имя и фамилия атлета записываются в глобальные переменные (рисунок 7,8)
Рисунок 5- таблица «соревнования»
Рисунок 6- таблица «вид_спорта»
Листинг. Процедура поиска соревнования для спортсмена по виду спорта
DELIMITER //
CREATE PROCEDURE сompetition_search(IN athlete_id INT, IN sport_type VARCHAR(255))
BEGIN
-- Объявление глобальных переменных для хранения ID соревнования и информации о спортсмене
DECLARE competition_id INT;
SET @athlete_name = '';
SET @athlete_surname = '';
SET competition_id = 0;
-- Поиск доступного соревнования для введенного вида спорта
SELECT c.код_соревнования INTO competition_id
FROM соревнования c
JOIN вид_спорта v ON v.код_вида_спорта = c.код_вида
WHERE v.название = sport_type AND c.дата_проведения >= NOW()
ORDER BY c.дата_проведения
LIMIT 1;
-- Если соревнование найдено, то
IF competition_id > 0 THEN
SELECT имя, фамилия INTO @athlete_name, @athlete_surname
FROM спортсмены
WHERE код_спортсмена = athlete_id;
-- Вывод информации о соревновании
SELECT @athlete_name, @athlete_surname, competition_id, c.дата_проведения as competition_date, sport_type
FROM соревнования c
WHERE c.код_соревнования = competition_id;
ELSE
SELECT 'Нет доступных соревнований для выбранного вида спорта.';
END IF;
END;
//
DELIMITER ;
CALL competition_search(3, 'теннис');
Рисунок 7- выполнение процедуры competition_search по виду спорта «теннис»
Рисунок 8- выполнение процедуры competition_search по несуществующему виду спорта
Для просмотра списка хранимых процедур БД, выполнены команды USE и SHOW PROCEDURE STATUS (рисунок 9)
Рисунок 9- вывод всех хранимых процедур БД
Рисунок10- фрагмент списка хранимых процедур БД
Вывод: реализованы две хранимые процедуры: training_time и competition_search. Training_time выводит в какое время дня у тренера тренировка, competition_search выполняет поиск соревнования по виду спорта, и сравнивает дату соревнования с сегодняшней.
Список используемых источников:
1. A.В. Аграновский, В.В. Боженко, Е.Л. Турнецкая. - Учебно-методическое пособие «Разработка и администрирование базы данных с открытым исходным кодом»‒ СПб.: ГУАП, 2022
2. Руководство по MySQL: https://metanit.com/sql/mysql.