Программирование на T-SQL. Хранимые процедуры. Создание хранимых процедур. Переменные, параметры и коды возврата, страница 3

                                 END

Инструкция WHILE применяется для многократного выполнения блока кода до тех пор, пока заданное условие истинно.

Пример 2.10.

Пример многократного выполнения кода блока с помощью инструкции WHILE.

                           DECLARE @var1 int

                                       ,@var2 varchar(30)

SET @var1 = 1

WHILE @var1 <= 10

BEGIN

                                             SET @var2 = 'Итерация #' + CAST(@var1 AS varchar(2))

                                       PRINT @var2

                                       SET @var1= @var1+ 1

END

Инструкция BREAK применяется вместе с циклом WHILE. Если необходимо прервать выполнение в теле цикла WHILE, с помощью этой инструкции можно прервать повторное выполнение цикла. После выполнения инструкции BREAK выполняется строка программного кода, следующая за циклом WHILE.  

Инструкция CONTINUE применяется в цикле WHILE ДЛЯ того, чтобы заставить код продолжить выполнение с первой строки цикла.

Инструкция WAITFOR позволяет сделать паузу в выполнении программного кода. У этой инструкции есть варианты: WAITFOR DELAY и WAITFOR TIME. Вариант WAITFOR TIME прерывает выполнение программного кода до наступления заданного момента времени. Вариант WAITFOR DELAY приостанавливает выполнение на заданный промежуток времени.

Инструкция GOTO позволяет передать выполнение на метку, встроенную в процедуру. Применение конструкций, подобных GOTO, не одобряется во всех языках программирования.

2.4.     Сообщения об ошибках

При обработке ошибок очень удобна функцияRAISERROR, при помощи которой можно сообщить приложению, что произошла ошибка, и какая это ошибка.

RAISERROR ({msg_id | msg_str | @local_variable}

         {, severity, state}

         [, argument  [,...n] ]) 

•  msg_id | msg_str | @local_variable — код ошибки или строка-сообщение об ошибке. Код должен быть больше 50000, а сообщение об ошибке может быть длиной до 255 символов Unicode. @local_variabie — переменная строкового типа, содержащая сообщение об ошибке;

•  severity — уровень серьезности ошибки. Ошибки с уровнями серьезности 20—25 считаются фатальными и вызывают разрыв соединения и откат всех открытых транзакций.

•  state — статус ошибки. Используется при идентификации однотипных ошибок;

•  argument— значение объекта, при обработке которого была сгенерирована ошибка;

Пример 2.11.

Ниже представлен фрагмент обработки ошибки с использованием функции RAISERROR.

BEGIN TRY

                                      INSERT dbo.firm(name_firm)

                                      VALUES ('Franchi S.p.A.')

END TRY 

BEGIN CATCH

-- сообщим клиентскому приложению об ошибке 

RAISERROR('Нарушена уникальность ключа!',13,3)  END CATCH

2.5.     Обработка ошибок

До версии SQL Server 2005 единственным способом обработки ошибок была проверка значения глобальной переменной @@error.  

При выполнении каждой инструкции SQL Server записывает состояние завершения в @@error. ЕСЛИ возникла ошибка, ее номер содержится в @@error. Если инструкция выполнилась успешно, переменная @@error содержит 0. Вам необходимо запросить переменную, чтобы узнать успешно или аварийно завершилась инструкция. Применение @@error для обработки ошибок очень обременительно, т. к. требует встроенных проверок после каждой инструкции и процедуры обработки ошибок для каждой инструкции.

Теперь для более структурированного подхода к обработке ошибок, подобного процедурам обработки ошибок в других языках программирования, можно применять блок TRY...CATCH.

Пример 2.12.

И следующем программном коде создается ошибка из-за нарушения ограничения первичного ключа.

CREATE TABLE dbo.mytable

(ID INT NOT NULL PRIMARY KEY)