Готовые отчеты / Базы данных. Лабораторная работа 3
.pdfФедеральное агентство связи ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М. А. БОНЧ-БРУЕВИЧА» (СПбГУТ)
Факультет инфокоммуникационных сетей и систем Кафедра фотоники и линий связи
ЛАБОРАТОРНАЯ РАБОТА №3 по дисциплине «Базы данных»
на тему «Хранимые процедуры в MySQL»
Выполнили: студенты 3-го курса дневного отделения группы ИКПИ-85 Ежуров Антон Павлович
Коваленко Леонид Александрович Преподаватель:
ассистент кафедры ПИиВТ Овчинников Антон Олегович
Санкт-Петербург
2020
Цель работы Получить практические навыки создания хранимых процедур и работы
с переменными на языке SQL.
Ход работы
Создадим базу данных university в программе-дизайнере MySQL Workbench. В этой базе данных создадим таблицу departments с полями:
1.id типа INT, первичный ключ (PK), счетчик (AI);
2.name типа VARCHAR, ненулевое (NN).
Заполним таблицу departments произвольными двумя записями (для поля name будем использовать название групп своего потока) (табл. 1). Таблица 1 — Таблица departments базы данных university
id |
name |
|
|
1 |
ИКПИ-81 |
|
|
2 |
ИКПИ-85 |
В базе данных university создадим таблицу users с полями: 1. id типа INT, первичный ключ (PK), счетчик (AI);
2. name типа VARCHAR, ненулевое (NN);
3. department_id типа INT.
Заполним таблицу users произвольными записями — пять строк, при этом: две записи из таблицы users свяжем с первой группой из таблицы departments, а остальные записи свяжем со второй группой через поле id
таблицы departments и department_id таблицы users (табл. 2).
Таблица 2 — Таблица users базы данных university
id |
name |
department_id |
1 |
Алексей |
1 |
|
|
|
2 |
Михаил |
1 |
|
|
|
3 |
Елена |
2 |
|
|
|
4 |
Иван |
2 |
|
|
|
5 |
Владимир |
2 |
Создадим хранимую процедуру с именем getUserInfo (раздел Routines в MySQL Workbech).
Заполним тело процедуры согласно образцу (табл. 3).
2
Таблица 3 — Процедура getUserInfo
CREATE PROCEDURE `university`.`getUserInfo` (IN param1 VARCHAR(45), OUT param2 INT)
BEGIN
DECLARE UserName VARCHAR(45); SET UserName = 'Иван';
IF param1 IS NOT NULL THEN SET UserName = param1;
END IF;
SELECT departments.name AS departments INTO @department FROM users LEFT JOIN departments ON users.department_id = departments.id WHERE users.name = UserName;
SELECT COUNT(*) INTO param2 FROM users;
END
Сохраним созданную в программе-дизайнере схему базы данных на локальный компьютер.
Запустим генерацию базы данных на сервере MySQL (Пункт меню: Database → Forward Engineer). В опциях поставим галки напротив пунктов
Generate INSERT statements for tables и DROP objects before each CREATE object.
Подключимся к базе данных MySQL (команда mysql -u root -p) и активизируем базу данных university (команда use university).
Выполним SQL-команды (рис. 1):
SELECT * FROM users; SELECT * FROM departments;
Рисунок 1 — Результат добавления 3
Запустим созданную хранимую процедуру и посмотрим результат (рис.
2):
CALL getUserInfo(NULL, @total); SELECT @department;
SELECT @total;
Рисунок 2 — Результат работы процедуры с пустым значением первого параметра
Запустим созданную хранимую процедуру, изменив первый параметр с NULL на имя пользователя 'Михаил' из таблицы users (рис. 3):
CALL getUserInfo('Михаил', @total); SELECT @department;
SELECT @total;
Рисунок 3 — Результат работы процедуры с непустым значением первого параметра
4
Выводы Хранимая процедура представляет собой набор инструкций, которые
выполняются как единое целое. Тем самым хранимые процедуры позволяют упростить комплексные операции и вынести их в единый объект.
Достоинства хранимой процедуры:
—упрощает управление кодом;
—позволяет ограничить доступ к данным в таблицах и уменьшить вероятность нежелательных действий в отношении этих данных;
—обычно выполняются быстрее, чем обычные SQL-инструкции, так как код процедур компилируется один раз при первом ее запуске, а затем сохраняется в скомпилированной форме.
Для создания хранимой процедуры применяется команда CREATE
PROCEDURE.
Для выполнения хранимой процедуры применяется команда после которой указывается имя процедуры.
Переменные бывают пользовательскими (такая переменная создается в момент присвоения ей значения и хранится до завершения соединения с сервером; пишется со знаком @, например, @total), переменными хранимого кода (имеют ограниченную область видимости; пишется без знака @) и системными.
Пользовательская переменная:
SET @total = 5;
Переменная хранимого кода:
DECLARE total INT DEFAULT 5;
или
DECLARE total INT; SET total = 5;
Системная переменная может быть глобальной или переменной сеанса. Глобальная системная переменная:
SET GLOBAL total = 5;
или
SET @@global.total = 5;
5
Переменная сеанса:
SET total = 5;
или
SET SESSION total = 5;
или
SET @@total = 5;
или
SET @@local.total = 5;
6