Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Готовые отчеты / Базы данных. Лабораторная работа 6

.pdf
Скачиваний:
45
Добавлен:
29.01.2021
Размер:
242.22 Кб
Скачать

Федеральное агентство связи ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ

ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М. А. БОНЧ-БРУЕВИЧА» (СПбГУТ)

Факультет инфокоммуникационных сетей и систем Кафедра фотоники и линий связи

ЛАБОРАТОРНАЯ РАБОТА №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