Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

LR6.Tyutterin_Yakov_Z1411

.pdf
Скачиваний:
0
Добавлен:
29.04.2024
Размер:
4.45 Mб
Скачать

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ федеральное государственное автономное образовательное учреждение высшего образования

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»

ИНСТИТУТ НЕПРЕРЫВНОГО И ДИСТАНЦИОННОГО ОБРАЗОВАНИЯ

КАФЕДРА ПРИКЛАДНОЙ ИНФОРМАТИКИ

ОЦЕНКА

ПРЕПОДАВАТЕЛЬ

канд. техн. наук, доц.

 

Е. Л. Турнецкая

должность, уч. степень, звание

подпись, дата

инициалы, фамилия

ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №6

Программная реализация пользовательских функций

по дисциплине: Базы данных

РАБОТУ ВЫПОЛНИЛ

 

 

 

 

 

СТУДЕНТ гр. №

Z1411

 

 

Я. Н. Тюттерин

 

 

 

 

 

 

 

номер группы

подпись, дата

 

инициалы, фамилия

Студенческий билет №

2022/4886

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Санкт-Петербург 2024

Лабораторная работа № 6. ПРОГРАММНАЯ РЕАЛИЗАЦИЯ ПОЛЬЗОВАТЕЛЬСКИХ ФУНКЦИЙ.

Цели работы: Программная реализация пользовательских функций на сервере.

Вариант 18. Занятость актеров театра. Работников театра можно подразделить на актеров, музыкантов, постановщиков и служащих. Каждая из перечисленных категорий имеет уникальные атрибуты-характеристики и может подразделяться (например, постановщики) на более мелкие категории. Театр возглавляет директор, в функции которого входят контроль за постановками спектаклей, утверждение pепеpтуаpа, принятие на работу новых служащих, приглашение актеров и постановщиков. Актеры, музыканты и постановщики, работающие в театре, могут уезжать на гастроли. Актеры театра могут иметь звания заслуженных и народных артистов, могут быть лауреатами конкурсов. Также актерами театра могут быть и студенты театральных училищ. Каждый актер имеет свои вокальные и внешние данные (пол, возраст, голос, pост и т.п.), которые могут подходить для каких-то pолей, а для каких-то нет (не всегда женщина может сыграть мужчину и наоборот). Для постановки любого спектакля необходимо подобрать актеров на роли и дублеров на каждую главную pоль. Естественно, что один и тот же актер не может играть более одной pоли в спектакле, но может играть несколько pолей в различных спектаклях. У спектакля также имеется pежисеp-постановщик, художник-постановщик, диpижеp- постановщик, автор. Спектакли можно подразделить по жанрам: музыкальная комедия, трагедия, оперетта и пр. С другой стороны, спектакли можно подразделить на детские, молодежные и пр. В pепеpтуаpе театра указывается какие спектакли, в какие дни и в какое время будут проходить, а также даты пpемьеp. В кассах театра можно заранее приобрести билеты или абонемент на любые спектакли. Абонемент обычно включает в себя билеты на спектакли либо конкретного автора, либо конкретного жанра. Цена билетов зависит от места, и спектакля. На премьеры билеты дороже. Администрацией театра фиксируется количество проданных билетов на каждый спектакль.

Рисунок 1 - Схема БД

Была написана функция для создания достижения с дальнейшей привязной ее к работнику. На вход функция принимает идентификатор работника, к которому будет привязано достижение и название достижения, которые необходимо создать. Также для дополнительной практики были добавлены условные операторы для проверки того, что название достижение походит под ограничения, накладываемые таблицей в БД. В результате получаем:

CREATE FUNCTION ADD_ACHIEVEMENT (workerId integer, titleAchievement varchar(100))

RETURNS VARCHAR(100)

DETERMINISTIC BEGIN

DECLARE lengthTitle integer;

DECLARE achievement_id integer;

if (titleAchievement is null) then

RETURN (select 'Value for titleAchievement is required!!!');

else

SET lengthTitle = LENGTH(titleAchievement); IF (lengthTitle > 30 OR lengthTitle < 1) THEN

RETURN (select 'Length titleAchivement > 30 || < 1 !!!');

ELSE

insert INTO achievements(name) values (titleAchievement); INSERT INTO achievement_worker(achievement_id, worker_id)

VALUES ((SELECT LAST_INSERT_ID()), workerId);

SET achievement_id = (SELECT LAST_INSERT_ID());

RETURN (CAST(achievement_id AS CHAR));

END IF;

END IF;

END;

Результат корректного выполнения:

Передача некорректного параметра с названием достижения:

Передача null в качестве названия достижения:

Результат выполнения SELECT-запроса:

Для заполнения билетов для спектакля создана функция, которая принимает на вход: showId - идентификатор спектакля

startPrice - стартовая цена билета step - шаг цены билета между рядами

emount - количество билетов суммарно на все ряды

Результат создания функции:

CREATE FUNCTION INIT_TICKETS (showId integer, startPrice integer, step integer, emount integer)

RETURNS integer DETERMINISTIC BEGIN

DECLARE counts integer;

SET counts = emount;

IF (step > 0 AND emount > 0 AND startPrice > 0) THEN

REPEAT

IF (counts % 10 = 0) THEN

SET startPrice = startPrice + step;

END IF;

INSERT INTO tickets (showId, place, price) VALUES (showId, counts, startPrice);

SET counts = counts - 1; UNTIL counts = 0

END REPEAT;

ELSE

RETURN -1; END IF;

RETURN (select count(*) from tickets t where t.show_id = showId);

END;

Результат вызова функции:

Результат SELECT-запроса:

При попытке передать в функцию отрицательное значение, будет возвращено значение -1, что указывает на то, что ни одна запись не была произведена.

Тесты:

Список хранимых процедур и функций:

Представление функции ADD_ACHIEVEMENT в виде блок-схемы:

Представление функции INIT_TICKETS в виде блок-схемы:

Вывод

В результате проделанной работы был получен практический опыт создания функций для БД MySql. Функции могут быть использованы для ускорения операций вставки и заполнения. Например, вторая позволяет ускорить процесс генерации билетов на спектакль. Теперь достаточно передать необходимые параметры, что в результате позволит создать билеты моментально, без дополнительных временных затрат.

Основная сложность возникла лишь из-за различия синтаксиса, так как до этого использовал и работал лишь с PostgreSQL.

Основной плюс от использования функций - это снижение сетевого трафика между клиентами и сервером. Команды в процедуре выполняются как один пакет кода, что позволяет существенно сократить сетевой трафик. Это характерно для тех случаев, когда мы хотим выполнить множество запросов к БД. А их можно было бы описать в рамках одной функции. Таким образом не будет издержек на соединения с сервером БД для отправки запроса. +в результате мы можем получить значение, которое будет описывать то, произошла вставка или нет. То есть можно описать в документации по функции коды ответов, на которые пользователь функции сможет опираться при работе с ней. Например, сейчас задано во второй функции то, что в случае, если одно из значений параметров(за исключением идентификатора спектакля) будет отрицательным - будет возвращено значение -1, что сигнализирует о некорректных входных параметрах.

Список использованных источников:

1)https://dev.mysql.com/doc/refman/8.0/en/create-function.html

2)https://stackoverflow.com/

3)https://www.mysqltutorial.org/mysql-stored-function/getting-started-with-mysql-stored- functions/

4)https://www.careerride.com/MySQL-Stored-Functions.aspx

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]