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

Лабораторные работы. Дятлов / Отчет Базы данных №6

.pdf
Скачиваний:
0
Добавлен:
31.10.2025
Размер:
375.8 Кб
Скачать

Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации

Федеральное государственное бюджетное образовательное учреждение Высшего образования «Санкт-Петербургский государственный университет телекоммуникаций им. Проф. М. А. Бонч-Бруевича» (СПбГУТ)

Факультет Информационных технологий и программной инженерии

Кафедра Программной инженерии

Лабораторная работа

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

Выполнил студент: Яковлев М. А. ИКПИ-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