Лабораторные работы. Дятлов / Отчет Базы данных №6
.pdfМинистерство цифрового развития, связи и массовых коммуникаций Российской Федерации
Федеральное государственное бюджетное образовательное учреждение Высшего образования «Санкт-Петербургский государственный университет телекоммуникаций им. Проф. М. А. Бонч-Бруевича» (СПбГУТ)
Факультет Информационных технологий и программной инженерии
Кафедра Программной инженерии
Лабораторная работа
По дисциплине: База данных
Выполнил студент: Яковлев М. А. ИКПИ-32
Принял работу: Дятлов Д. А.
Дата выполнения: «28» октября 2025 г.
Санкт-Петербург
2025 г.
Цель работы
Цель работы – получение практических навыков в работе с курсорами и обработчиками событий на языке SQL.
Ход выполнения
1.В программе-дизайнере MySQL Workbench была создана база данных university.
2.В базе данных создана таблица users с полями id (PK, AI), name (VARCHAR(45), NN), d_id (INT) и заполнена 5 произвольными записями.
3.Создана таблица hobbies с полями id (PK, AI), hobby (VARCHAR(45), NN), u_id (INT) и заполнена 7 произвольными записями, связанными с пользователями через поле u_id.
Была создана таблица под названием Hobbies:
Рисунок 1. Таблица Hobbies
4. Создана хранимая процедура showHobbies, использующая курсоры для формирования строки со списком хобби каждого пользователя.
DELIMITER //
CREATE PROCEDURE university.showHobbies (OUT printstr VARCHAR(500)) BEGIN
DECLARE done BOOLEAN DEFAULT FALSE;
DECLARE cur_id, cur_u_id INT;
DECLARE cur_name, cur_hobby CHAR(45);
DECLARE outstr VARCHAR(500) DEFAULT '
';
DECLARE workstr VARCHAR(500) DEFAULT '';
DECLARE curusers CURSOR FOR
SELECT id, name FROM users;
DECLARE curhobbies CURSOR FOR
2
SELECT u_id, hobby FROM hobbies;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE; -- Loop through users
OPEN curusers;
USERSLOOP: LOOP
FETCH curusers INTO cur_id, cur_name;
IF done THEN
LEAVE USERSLOOP;
END IF;
SELECT CONCAT('The hobby list ', cur_name, ' is ') INTO workstr; -- Loop through hobbies
OPEN curhobbies;
FETCH curhobbies INTO cur_u_id, cur_hobby;
WHILE NOT done DO
IF cur_id = cur_u_id THEN
SELECT CONCAT(workstr, cur_hobby) INTO workstr;
SELECT CONCAT(workstr, ', ') INTO workstr;
END IF;
FETCH curhobbies INTO cur_u_id, cur_hobby;
END WHILE;
SET done := FALSE;
CLOSE curhobbies;
SET outstr := CONCAT(outstr, workstr, '
');
END LOOP USERSLOOP;
CLOSE curusers;
SET printstr := outstr;
END//
5. Результат выполнения команд:
CALL showHobbies(@list);
SELECT @list;
Результаты выполнения команд:
3
Рисунок 2. Результат команд showHobbies(@list); SELECT @list;
Выводы
В ходе лабораторной работы были получены практические навыки работы с курсорами в MySQL. Курсор является инструментом для пошаговой обработки строк из результирующего набора данных в хранимых процедурах. С помощью курсоров можно организовать цикличный обход записей и выполнение сложных операций над каждой строкой. Для корректной работы с курсорами необходимо использовать обработчики для реакции на ситуации, например, когда строки в наборе заканчиваются (NOT FOUND). В данной работе с помощью двух курсоров и вложенного цикла был сформирован читаемый список хобби для каждого пользователя.
Контрольные вопросы
№1. Что такое курсор? Приведите пример синтаксиса курсора?
Курсор – это объект базы данных, который позволяет applications поэтапно обрабатывать результирующий набор строк. Пример объявления курсора:
DECLARE curusers CURSOR FOR SELECT id, name FROM users;
№2. Какая команда SQL передвигает указатель курсора вперед?
Для перемещения курсора на следующую строку и извлечения данных в переменные используется командаFETCH.
FETCH curusers INTO cur_id, cur_name;
№3. Что такое обработчик/драйвер? Приведите пример синтаксиса.
Обработчик (HANDLER) – это механизм, который определяет действия, которые должны быть выполнены при наступлении определенного условия. Пример объявления обработчика для ситуации, когда строки в курсоре закончились:
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
4
