Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка СУБД MySQL Visual Studio Кузин.doc
Скачиваний:
110
Добавлен:
13.05.2015
Размер:
2.65 Mб
Скачать
    1. Задание на лабораторную работу

  1. Для БД «Предприятие» реализовать и проверить работу следующих процедур и функций:

    1. Реализовать функцию, которая возвращает количество различных городов, в которых находятся поставщики определенного проекта (входной параметр).

    2. Реализовать функцию, которая возвращает количество различных городов, в которых находятся проекты, обеспечиваемые определенным поставщиком (входной параметр).

    3. Реализовать функцию, которая возвращает количество различных городов, в которых находятся поставщики определенной детали (входной параметр).

    4. Реализовать процедуру, которая выводит информацию обо всех поставщиках и количестве различных городов, в которых находятся обслуживаемые ими проекты. Примечание: использовать функцию, реализованную в п. 1.b.

    5. Реализовать процедуру, которая выводит информацию обо всех проектах и количестве различных городов, в которых находятся обслуживающие их поставщики. Примечание: использовать функцию, реализованную в п. 1.a.

  2. Написать процедуру, которая изменяет имя каждой детали на имя, формируемое как «Имя_детали-N», где N – порядковый номер в списке всех одноименных деталей в порядке возрастания веса детали. Примечание: использовать вызов вышеописанной процедуры Parts_rename.

    1. Содержание отчета

В отчете привести код процедур и функций, результаты выполнения, содержимое таблиц до и после (при необходимости) выполнения процедур и функций.

Пример реализации функции, которая возвращает количество различных городов, в которых находятся проекты, где используется определенная деталь (входной параметр):

CREATE FUNCTION Qty_of_Prj_Towns(S VARCHAR(20))

RETURNS INTEGER

BEGIN

DECLARE N INTEGER;

SELECT COUNT(*) INTO N FROM Towns WHERE Town_ID IN (SELECT Projects.Town_ID FROM Parts, Projects, Supply WHERE Parts.Part_ID= Supply.Part_ID AND Projects.Project_ID=Supply.Project_ID AND Parts.Part_name=S);

RETURN N;

END

  1. Исключения и триггеры

    1. Исключения

Исключения, или исключительные ситуации – это ошибки, которые возникают в процессе выполнения инструкций SQL.MySQL перехватывает ошибки и реагирует на них при помощи т.н. обработчиков (handlers). Механизм функционирования обработчиков ис­ключений позволяет четко отделить код обработки ошибок от исполняемых опера­торов.

Когда происходит ошибка, инициируется исключение. В результате выполнение исполняе­мого блока прерывается и управление передается отдельному разделу исключений в текущем блоке, если таковой имеется. После обработки исключения возврат в тот блок, из которого оно было инициировано, невозможен, поэтому управле­ние переходит во внешний блок.

Существует два вида исключений:

Системное исключение.Определяется вMySQL и обычно инициируется ядром СУБД, обнаружившим ошибку.

Пользовательское исключение.Определяется программистом, следовательно оно специфично для данного приложения.

Системные исключения возникают при попытке выполнения недопустимых SQL-инструкций. О возникновении исключения можно узнать из сообщения клиентаmysql.exe. Например, при попытке выбрать данные из несуществующей таблицы произойдет следующее:

Информация о произошедшем исключении стоит из трех элементов:

1. Число – код ошибки (1146). Этот код определен в MySQLи несовместим с другими СУБД.

2. Пятисимвольный код системной переменной SQLSTATE(42S02). Эти значения определяются в стандартахANSISQLиODBCи стандартизированы в большей степени.

3. Текстовое описание ошибки (Table ‘database1.no_such_table’ doesn’t exist).

При создании обработчика исключения можно использовать различные способы идентификации исключения. Синтаксис оператора создания исключения:

DECLARE<тип_обработчика>HANDLER

FOR<идентификатор_исключения> [,<идентификатор_исключения>] ...

<операторы>;

Здесь параметр <тип_обработчика> может принимать значения CONTINUE, EXIT или UNDO. Для обработчиков типа CONTINUE выполнение программы, вызвавшей исключение, продолжается после выполнения кода обработчика. Для обработчиков типа EXITвыполнение текущего блокаBEGIN…ENDпрограммы, вызвавшей исключение, прерывается. Обработчики типаUNDOне поддерживаются в версииMySQL5.5.

Параметр <идентификатор_исключения> может представлять собой значение SQLSTATE, имя исключения, которое было задано при его создании оператором DECLARE ... CONDITION, а также одно из ключевых слов:

SQLWARNING – синоним для значений SQLSTATE, начинающихся с 01

NOT FOUND - синоним для значений SQLSTATE, начинающихся с 02

SQLEXCEPTION - синоним для значений SQLSTATE, НЕ начинающихся с 00, 01 или 02

Например, создадим процедуру, в которой определим обработчик для исключения с кодом 42S02:

CREATE PROCEDURE h()

BEGIN

DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SELECT (‘Таблица не существует!’);

SELECT * FROM No_such_table;

END;

Вариант процедуры с предварительно заданным именем исключения при помощи DECLARE ... CONDITION:

CREATE PROCEDURE h()

BEGIN

DECLARE No_my_table CONDITION FOR SQLSTATE '42S02';

DECLARE CONTINUE HANDLER FOR No_my_table SELECT (‘Таблица не существует!’);

SELECT * FROM No_such_table;

END;

Вариант процедуры с использованием синонима SQLEXCEPTION для идентификации исключения:

CREATE PROCEDURE h()

BEGIN

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SELECT (‘Таблица не существует!’);

SELECT * FROM No_such_table;

END;

Следующий пример демонстрирует продолжение выполнения программы после обработчика типа CONTINUE:

CREATE PROCEDURE h()

BEGIN

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SELECT (‘Таблица не существует!’);

SELECT * FROM No_such_table;

SET @A=1;

END;

Если использовать обработчик типа EXIT, то выполнение программы прерывается:

CREATE PROCEDURE h()

BEGIN

DECLARE EXIT HANDLER FOR SQLEXCEPTION SELECT (‘Таблица не существует!’);

SELECT * FROM No_such_table;

SET @A=1;

END;

Следующая процедура содержит обработчик исключения 23000 (ER_DUP_KEY)

CREATE PROCEDURE h()

BEGIN

DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SELECT ‘Первичный ключ уже существует’;

INSERT INTO Parts VALUES (9,’Spoon’,’Wood’,30);

INSERT INTO Parts VALUES (9,’Spoon’,’Wood’,30);

END;