
5сем / lab6_database
.docxГУАП
КАФЕДРА № 41
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
Ассистент |
|
|
|
Б.К.Акопян |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №6 |
ПРОГРАММНАЯ РЕАЛИЗАЦИЯ ХРАНИМЫХ ПРОЦЕДУР |
по курсу: БАЗЫ ДАННЫХ |
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № |
4016 |
|
|
|
М.О. Жовтяк |
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2022
Цель работы
Программная реализация хранимых процедур на сервере.
Вариант работы
Вариант 14.
Библиотека в Хоббитонии есть библиотека «Башня Саурумана». Вы являетесь ее руководителем. Библиотека зарабатывает деньги, выдавая напрокат некоторые книги, имеющиеся в небольшом количестве экземпляров. Одной из задач разрабатываемой ИС является отслеживание финансовых показателей работы библиотеки. У каждой книги, выдаваемой в прокат, есть название, автор, жанр. В зависимости от ценности книги Вы определили для каждой из них залоговую стоимость (сумма, вносимая клиентом при взятии книги напрокат) и стоимость проката (сумма, которую клиент платит при возврате книги, получая назад залог). В библиотеку обращаются читатели. Все читатели регистрируются в картотеке, указывая свои персональные данные. Каждый читатель может обращаться в библиотеку несколько раз. Все обращения читателей фиксируются, при этом по каждому факту выдачи книги запоминаются дата выдачи и ожидаемая дата возврата. Стоимость проката книги должна зависеть не только от самой книги, но и от срока ее проката. Кроме того, необходимо добавить систему штрафов за вред, нанесенный книге и систему скидок для некоторых категорий читателей. Произведения авторов, составляющие библиотечный фонд, также можно разделить на различные категории, характеризующиеся собственным набором атрибутов: учебники, повести, романы, статьи, стихи, диссертации, рефераты, тезисы докладов и т.д. Сотрудники библиотеки, работающие в различных залах различных библиотек, ведут учет читателей, а также учет размещения и выдачи литературы.
Ход работы
На рисунке 1 представлена схема данных БД согласно индивидуальному варианту.
Рисунок 1 – Схема данных БД
Создается процедура в MySQL c определенной задачей. Задача заключается в заполнения столбца total таблицы appeals(обращения). В этом столбце заполняется итоговая стоимость аренды книги, которая рассчитывается исходя из депозита, суточной аренды, количества дней пользования книгой, скидки. При этом скидка распространяется только на оговоренный ранее срок. Входные параметры представлены в таблице 1.
Таблица 1
Входные параметры процедуры
-
Название
Тип данных
Комментарий
full_fill
VARCHAR(1)
y/n – ответ на вопрос, нужно ли полное заполнение
id1
INT
Номер обращения при ответе “n”, не учитывается при “y”
Процедура содержит условие y/n. При выборе “y” выполняется автоматический подсчет каждой строки столбца total в рамках цикла. При выборе “n” выполняется подсчет определенного обращения, выбранного в качестве второго параметра. Блок-схема процедуры представлена на рисунке 2, листинг представлен в Приложении.
Рисунок 2 – Блок-схема процедуры
Результаты выполнения процедуры представлены на рисунках 3-6.
Рисунок 3 – Таблица appeals до выполнения процедуры
Рисунок 4 – Заполненная позиция по номеру обращения
Рисунок
5 – Полное заполнение столбца total
Рисунок
6 – Журнал истории выполнения процедуры
Прикладное назначение процедуры очень удобное: администратор библиотеки больше может не считать количество дней аренды каждого обращения, и нет необходимости искать конкретный номер депозита и аренды за книгу, скидку читателя для подсчета итоговой стоимости аренды. Также данная процедура полезна тем, что можно узнать стоимость аренды не только определенной позиции, но и автоматическом заполнении всего столбца, что экономит много времени.
Вывод
В ходе работы я научился создавать процедуры на сервере с помощью языка MySQL. Я познакомился с основными принципами программирования на этом языке, а именно: переменные, условия, циклы, функции. В итоге мной была создана процедура, которая автоматически подсчитывает итоговую стоимость аренды книги.
В ходе работы проблем не возникло.
ПРИЛОЖЕНИЕ
DROP PROCEDURE IF EXISTS filling_total;
DELIMITER //
CREATE PROCEDURE filling_total(full_fill varchar(1), id1 int)
BEGIN
IF full_fill = 'y' THEN
SET @cikl = (SELECT MAX(id_appeal) FROM my_library.appeals);
SET @summa = 0;
WHILE @cikl > 0 DO
SET @summa = (SELECT (datediff(my_library.appeals.return_day, my_library.appeals.issue_date)
* my_library.books.coast_per_day + my_library.books.deposit
- datediff(my_library.appeals.return_day_expected, my_library.appeals.issue_date)*my_library.readers.discount_reader/100)
FROM my_library.appeals, my_library.books, my_library.readers
WHERE my_library.appeals.id_appeal = @cikl
and my_library.appeals.id_book = my_library.books.id_book
and my_library.appeals.id_reader = my_library.readers.id_reader);
UPDATE my_library.appeals
SET total = @summa
WHERE my_library.appeals.id_appeal = @cikl;
SET @cikl = @cikl - 1;
END WHILE;
END IF;
IF full_fill = 'n' THEN
SET @summa = (SELECT (datediff(my_library.appeals.return_day, my_library.appeals.issue_date)
* my_library.books.coast_per_day + my_library.books.deposit
- datediff(my_library.appeals.return_day_expected, my_library.appeals.issue_date)*my_library.readers.discount_reader/100)
FROM my_library.appeals, my_library.books, my_library.readers
WHERE my_library.appeals.id_appeal = id1
and my_library.appeals.id_book = my_library.books.id_book
and my_library.appeals.id_reader = my_library.readers.id_reader);
UPDATE my_library.appeals
SET total = @summa
WHERE my_library.appeals.id_appeal = id1;
END IF;
SELECT * FROM my_library.appeals;
END
//
CALL filling_total('y', 2);
Список использованных источников
Учебно-методическое пособие «Разработка и администрирование базы данных с открытым исходным кодом» - Аграновский А.В., В.В. Боженко, Е.Л. Турнецкая, 2022 г.