- •Лабораторная работа №1: Создание баз данных
- •Лабораторная работа №2: Создание таблиц и ограничений
- •Лабораторная работа №3: Основы Transact sql: Простые (однотабличные) выборки данных
- •Запросы на выборку данных (оператор select)
- •Лабораторная работа №4: Основы Transact sql: Сложные (многотабличные запросы)
- •Подзапросы
- •Операции соединения
- •Множественные операции
- •Лабораторная работа №5: Основы Transact sql: Добавление, изменение и удаление данных в таблицах
- •Добавление новых записей
- •Удаление записей
- •Изменение данных
- •Лабораторная работа №6: Представления
- •Создание представлений в Management Studio
- •Создание представлений с помощью кода sql
- •Предложение order by и представления
- •Выполнение представлений
- •Лабораторная работа №7: Программирование на t-sql Синтаксис и соглашения t-sql
- •Переменные
- •Средства управления потоком команд. Программные конструкции
- •Лабораторная работа №8: Хранимые процедуры
- •Лабораторная работа №9: Функции Системные функции
- •Пользовательские функции
- •Лабораторная работа №10: Обработка ошибок. Управление транзакциями. Триггеры. Обработка ошибок. Блок try…catch.
- •Активация сообщений об ошибках вручную. Инструкция raiserror
- •Управление транзакциями
- •Триггеры
Лабораторная работа №10: Обработка ошибок. Управление транзакциями. Триггеры. Обработка ошибок. Блок try…catch.
Стандартным способом перехвата и обработки ошибок в Transact-SQL(начиная с версииSQLServer2005) является использование конструкцииTRY...CATCH, который напоминает обработку исключений, применяемую во многих языках программирования (Delphi,C++,C# и т.д.).
Общий синтаксис конструкции TRY...CATCHследующий:
BEGIN TRY { инструкции T-SQL } END TRY BEGIN CATCH [ { инструкции T-SQL } ] END CATCH [ ; ]
Конструкция TRY…CATCHсостоит из двух частей: блокTRYи блокCATCH. При обнаружении ошибки в инструкцииT-SQLвнутри блокаTRYуправление передается блокуCATCH, где эта ошибка может быть обработана.
Блок TRYначинается с инструкцииBEGINTRYи завершается инструкциейENDTRY. Между ними могут быть помещены одна или несколько инструкцийT-SQL, при выполнении которых может произойти ошибка.
За блоком TRYсразу же должен следовать блок обработки ошибокCATCH. БлокCATCHначинается с инструкцииBEGINCATCHи завершается инструкциейENDCATCH. ВTransact-SQLкаждый блокTRYассоциирован только с одним блокомCATCH.
По завершении обработки исключения блоком CATCHуправление передается первой инструкцииT-SQL, следующей за инструкциейENDCATCH. Если инструкцияENDCATCHявляется последней инструкцией хранимой процедуры или триггера, управление возвращается коду, вызвавшему эту хранимую процедуру или триггер. ИнструкцииT-SQLв блокеTRY, следующие за инструкцией, вызвавшей ошибку, не выполняются.
Если в блоке TRYошибок нет, управление передается инструкции, следующей непосредственно за связанной с ней инструкциейENDCATCH. Если инструкцияENDCATCHявляется последней инструкцией хранимой процедуры или триггера, управление передается инструкции, вызвавшей эту хранимую процедуру или триггер.
Рассмотрим следующий пример:
BEGIN TRY
PRINT 'Первая попытка';
--Имитация ошибки (деление на ноль)
DECLARE @i int
SET @i = 5/0
PRINT 'Вторая попытка';
END TRY
BEGIN CATCH
PRINT 'Секция обработки ошибки';
END CATCH;
PRINT 'Третья попытка';
В результате выполнения данного блока кода будет получен следующий результат:
Первая попытка
Секция обработки ошибки
Третья попытка
В этом примере SQL Serverвыполняет секциюTRY, пока не встречает строку имитирующую ошибку (в данном случае деление на ноль). После этого все последующие инструкции в блокеTRY(в данном случае вывод сообщения о второй попытке) пропускаются, и управление передается в секциюCATCH. Следом за блокомCATCHвыполняется следующая по порядку инструкция, выводящая сообщение о третьей попытке.
Если в данном примере закомментировать строку, вызывающую ошибку, блок TRYбудет выполнен полностью, а блокCATCH- проигнорирован:
Первая попытка
Вторая попытка
Третья попытка
Активация сообщений об ошибках вручную. Инструкция raiserror
Чтобы вернуть произвольное сообщение об ошибке в вызывающую процедуру или клиентское приложение, используют команду RAISERROR.
Синтаксис этой команды следующий:
RAISERROR ( сообщение или номер ошибки, степень_серьезности, состояние, [ дополнительные_аргументы ])
Степень серьезности ошибки является указанием на то, какие меры следует принимать с учетом этой ошибки. Система обозначений степеней серьезности ошибок в СУБД SQLServerохватывает широкий спектр сообщений об ошибках, включая те, которые по существу являются информационными (со значениями степеней серьезности 1-18), считаются относящимися к системному уровню (19-25) и даже рассматриваются как катастрофические (20-25). При возникновении ошибок со степенями серьезности 20 и выше автоматически завершается работа пользовательских соединений. Если необходимо завершить выполнение процедуры и активировать в клиентской программе ошибку, как правило, указывается степень серьезности 16.
Обозначение состояния представляет собой произвольную величину. Этот параметр оператора RAISERRORбыл введен в действие с учетом того, что одна и та же ошибка может возникнуть в несколько местах кода. А параметр с обозначением состояния предоставляет возможность передать вместе с сообщением своего рода маркер участка кода, который показывает, где именно произошла ошибка. Числа с обозначением состояния могут находиться в пределах от 1 до 127.
Замените в предыдущем примере строку с ошибкой деления на ноль командой, генерирующей пользовательскую ошибку:
RAISERROR('Имитация ошибки',16,1)