Готовые отчеты / Базы данных. Лабораторная работа 6
.pdfФедеральное агентство связи ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М. А. БОНЧ-БРУЕВИЧА» (СПбГУТ)
Факультет инфокоммуникационных сетей и систем Кафедра фотоники и линий связи
ЛАБОРАТОРНАЯ РАБОТА №6 по дисциплине «Базы данных» на тему «Курсоры в MySQL»
Выполнили: студенты 3-го курса дневного отделения группы ИКПИ-85 Ежуров Антон Павлович
Коваленко Леонид Александрович Преподаватель:
ассистент кафедры ПИиВТ Овчинников Антон Олегович
Санкт-Петербург 2020
Цель работы Получить практические навыки в работе с курсорами и обработчиками
событий на языке SQL.
Ход работы
Создадим базу данных university в программе-дизайнере MySQL Workbench. В этой базе данных создадим таблицу users с полями:
1.id типа INT, первичный ключ (PK), счетчик (AI);
2.name типа VARCHAR, ненулевое (NN);
3.department_id типа VARCHAR.
Заполним таблицу users произвольными пятью записями (табл. 1). Таблица 1 — Таблица users базы данных university
id |
name |
department_id |
|
|
|
1 |
Алексей |
1 |
|
|
|
2 |
Михаил |
2 |
|
|
|
3 |
Елена |
3 |
|
|
|
4 |
Василий |
4 |
|
|
|
5 |
Владимир |
5 |
В этой базе данных создадим таблицу hobbies с полями:
1.id типа INT, первичный ключ (PK), счетчик (AI);
2.hobby типа VARCHAR, ненулевое (NN);
3.user_id типа VARCHAR.
Заполним таблицу users произвольными семью записями (табл. 2). Таблица 2 — Таблица hobbies базы данных university
id |
hobby |
user_id |
|
|
|
1 |
Вязание |
3 |
|
|
|
2 |
Туризм |
1 |
|
|
|
3 |
Туризм |
2 |
|
|
|
4 |
Рыбалка |
4 |
|
|
|
5 |
Кулинария |
5 |
|
|
|
6 |
Чтение |
4 |
|
|
|
7 |
Чтение |
5 |
Создадим хранимую процедуру showHobbies (раздел Routines в MySQL Workbench). Заполним тело процедуры согласно образцу (табл. 3).
2
Таблица 3 — Процедура showHobbies
CREATE PROCEDURE `university`.`showHobbies` (OUT print_str VARCHAR(500)) BEGIN
DECLARE done BOOLEAN DEFAULT FALSE; DECLARE cur_id, cur_u_id INT; DECLARE cur_name, cur_hobby CHAR(45);
DECLARE out_str VARCHAR(200) DEFAULT '\n'; DECLARE work_str VARCHAR(200) DEFAULT '';
DECLARE cur_users CURSOR FOR SELECT id, name FROM users;
DECLARE cur_hobbies CURSOR FOR SELECT user_id, hobby FROM hobbies;
# HANDLER нужен для обработки исключения (что делать когда данные закончатся)
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE; OPEN cur_users;
USERS_LOOP: LOOP
FETCH cur_users INTO cur_id, cur_name; IF done THEN
LEAVE USERS_LOOP; END IF;
SELECT CONCAT(CONCAT('The hobby list ', cur_name), ' is ') INTO work_str;
OPEN cur_hobbies;
FETCH cur_hobbies INTO cur_u_id, cur_hobby; WHILE NOT done DO
IF cur_id = cur_u_id THEN
SELECT CONCAT(work_str, cur_hobby) INTO work_str; SELECT CONCAT(work_str, ', ') INTO work_str;
END IF;
FETCH cur_hobbies INTO cur_u_id, cur_hobby; END WHILE;
SET done := FALSE; CLOSE cur_hobbies;
SET out_str := CONCAT(out_str, CONCAT(work_str, '\n')); END LOOP USERS_LOOP;
CLOSE cur_users;
SET print_str := out_str;
END
Сохраним созданную в программе-дизайнере схему базы данных на локальный компьютер.
Запустим генерацию базы данных на сервере MySQL (Пункт меню: Database → Forward Engineer). В опциях поставим галки напротив пунктов
Generate INSERT statements for tables и DROP objects before each CREATE object.
Подключимся к базе данных MySQL (команда mysql -u root -p) и активизируем базу данных university (команда use university).
В командной строке выполним следующие команды (рис. 1):
CALL showHobbies(@list); SELECT @list;
3
Рисунок 1 — Результат выполнения команд Выводы
Операции в реляционной базе данных выполняются над множеством строк. Набор строк, возвращаемый инструкцией SELECT, содержит все строки, которые удовлетворяют условиям, указанным в предложении WHERE инструкции. Такой полный набор строк, возвращаемых инструкцией, называется результирующим набором. Приложения, особенно интерактивные, не всегда эффективно работают с результирующим набором как с единым целым. Им нужен механизм, позволяющий обрабатывать одну строку или небольшое их число за один раз. Курсоры являются расширением результирующих наборов, которые предоставляют такой механизм.
Курсор — это поименованная область в памяти базы данных.
Курсор отслеживает позицию в результирующем наборе и позволяет выполнять несколько операций по строкам в результирующем наборе с возвратом к исходной таблице или без него. Курсор имеет имя, так как указывает на текущую позицию в результирующем наборе, так же как курсор на экране компьютера указывает на текущую позицию.
Например, рассмотрим приложение, которое отображает список доступных продуктов для потенциального покупателя. Покупатель прокручивает список, чтобы просмотреть сведения о продукте и стоимость, и, наконец, выбирает продукт для покупки. В оставшейся части списка появляется дополнительная прокрутка и выбор. С точки зрения покупателя продукты появятся по одному за раз, но приложение использует прокручиваемый курсор для просмотра результирующего набора.
4
Курсор не может использоваться сам по себе в MySQL. Это важный компонент в хранимых процедурах. Также курсоры часто применяются в операторах SQL, встроенных в написанные на языках процедурного типа прикладные программы.
Операторы управления курсором:
1. DECLARE — выполняет объявление явного курсора для отдельного оператора SELECT или для отдельной процедуры.
2. OPEN — открывает курсор, создавая новый результирующий набор на базе указанного запроса.
3. FETCH — выполняет последовательное извлечение строк из результирующего набора (в том числе передвигает указатель курсора вперед). Обычно это конструкция помещается в цикл, который прерывается по некоторому условию.
4. CLOSE — закрывает курсор и освобождает занимаемые им ресурсы. Скорость выполнения операций обработки данных посредством
курсора заметно ниже, чем у стандартных средств SQL.
5