Программирование >>  Программирование баз данных 

1 ... 114 115 116 [ 117 ] 118 119 120 ... 346


В подобных ситуациях можно воспользоваться оператором WAITFOR и поручить СУБД SQL Server обеспечить необходимое ожидание. Оператор WAITFOR имеет очень простой синтаксис:

WAITFOR

DELAY <time> TIME <time>

Оператор WAITFOR осуществляет именно то, о чем говорит его имя, - ожидает наступления того момента, который указан в параметре его вызова. Может быть указано либо явно заданное время суток, в которое с помощью этого оператора должно быть осуществлено определенное действие, либо указан промежуток времени, в течение которого необходимо организовать ожидание.

Параметр delay

Параметр DELAY позволяет указать промежуток времени ожидания. С помощью этого параметра нельзя указать промежуток времени, превышающий одни сутки, поскольку в нем разрешается задавать только время в часах, минутах и секундах. Максимально допустимая продолжительность задержки равна 24 часам. Рассмотрим один характерный пример:

WAITFOR DELAY 01:00

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

Параметр time

Параметр TIME обеспечивает ожидание до конкретного времени суток. И в этом случае невозможно указать какую-либо дату; допускается только указывать время в 24-часовом формате. И в этом случае продолжительность ожидания, установленного с помощью оператора WAITFOR, не превышает одних суток. В качестве примера рассмотрим оператор

WAITFOR TIME 01:00

Поэтому, например, если в сценарий включен приведенный выше оператор, то будет выполнен весь код, предшествующий оператору WAITFOR, затем будет вызван на вьшолнение оператор WAITFOR, произведена задержка до одного часа ночи (01:00), после чего вьшолнение кода продолжится с того оператора, который следует за ним.

Блоки TRY/CATCH

В применявшихся ранее версиях (под этим подразумеваются версии, предшествующие SQL Server 2005) возможности обработки ошибок были довольно ограниченными. Разумеется, проверка условий возникновения ошибок была предусмотрена, но сама эта проверка должна была быть выполнена заблаговременно. В связи с этим в некоторых случаях могли возникать такие ошибки, из-за которых происходило преждевременное завершение процедуры или сценария, поскольку вообще не было шансов перехватить и обработать ошибку (хотя иногда такая возможность все еще предоставлялась). Более полное обсуждение средств обработки ошибок приведено в описании хранимых процедур в главе 11, а в настоящей главе приведены основные сведения о блоках TRY/CATCH, которые были впервые представлены в современной версии SQL Server.



В программном обеспечении SQL Server блоки TRY/CATCH действуют во многом аналогично блокам обработки исключительных ситуаций, предусмотренным в процедурных языках программирования (С, С++, С#, Delphi и многих других). При этом применяется следующий синтаксис:

begin try

{ <sql statement(s)> } end try begin catch

{ <sql statement(s)> } end catch [ ; ]

Кратко можно отметить, что при обработке блока TRY в СУБД SQL Server предпринимается попытка выполнить операторы, вложенные в блок BEGIN. . .END, который сопровождает блок TRY. Затем, исключительно лишь при условии возникновения ошибки со степенью серьезности от 11 до 19, в СУБД SQL Server происходит немедленное завершение блока TRY и переход к выполнению первой строки блока CATCH. Информация о том, какие значения степени серьезности ошибки применяются в СУБД SQL Server, приведена в табл. 10.4.

Таблица 10.4. Классификация ошибок в СУБД SQL Server по степеням серьезности

Степень серьезности Описание

ошибки

1-1 о Сообщения об ошибках, формируемые только в целях предоставле-

ния дополнительной информации. К ним относятся сообщения, касающиеся изменения контекста, например, в результате корректировки настроек или обнаружения NULL-значений при вычислении агрегирующих функций. Обнаружение подобных ситуаций не приводит к активизации блока сатсн, поэтому если.должна быть выполнена проверка на наличие ошибки с такой степенью серьезности, ее следует провести вручную, путем анализа значения @@error

11-19 Относительно серьезные ошибки, которые, тем не менее, могут быть

обработаны в прикладном коде (в качестве примера можно указать нарушения ограничений внешнего ключа). Некоторые из подобных ошибок могут оказаться настолько серьезными, что дальнейшее выполнение кода станет недопустимым (к ним относятся, например, ошибки, возникающие из-за нехватки памяти), но по крайней мере остается возможность перехватывать эти ошибки и корректно завершать работу

20-25 Очень серьезные ошибки. Как правило, такие ошибки возникают на

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

Общий вывод из сказанного состоит в том, что для обработки ошибок со степенями серьезности, выходящими за пределы от 11 до 19, должны применяться другие средства, а не блоки TRY/САТСН.

Теперь для ознакомления на примере с тем, как применяются блоки TRY/САТСН, внесем некоторые изменения в сценарий CREATE, рассматриваемый в разделе с описанием оператором IF. . .ELSE. Напомним, что в предьщущем варианте сценария



проверка примен5и1ась отчасти для определения того, существует ли уже создаваемая таблица, чтобы предотвратить возникновение ошибки, которая может привести к неудачному завершению сценария. В программном обеспечении SQL Server применялся главным образом такой способ проверки (к тому же нелегко было бы предложить что-то другое). А в связи с вводом в действие блоков TRY/CATCH появилась возможность просто предпринимать попытку вьшолнения оператора CREATE, а затем обрабатывать ошибку в случае ее возникновения:

BEGIN TRY

-- Предпринимается попытка создать таблицу CREATE TABLE OurlFTest(

Coll int PRIMARY KEY

END TRY BEGIN CATCH

-- Возникла какая-то ошибка; попытаемся определить, известен ли способ --ее исправления DECLARE ©ErrorNo int,

©Severity tinyint,

©State smallint,

©LineNo int,

©Message nvarchar(4000)

SELECT

©ErrorNo = ERROR NUMBER{), ©Severity = ERROR SEVERITY(), ©State = ERROR STATE{), ©LineNo = ERROR LINE {), ©Message = ERROR MESSAGE{)

IF ©ErrorNo = 2714 -- Обнаруживается ошибка, указывающая на то, что объект -- уже существует, но в этом нет ничего неожиданного PRINT WARNING: Skipping CREATE as table already exists ELSE --Ho эта ошибка не может быть распознана, поэтому о ней необходимо сообщить и больше ничего не предпринимать RAISERROR{©Message, 16, 1 ) END CATCH

Необходимо подчеркнуть, что в приведенном выше коде для обнаружения состояния ошибки использовались определенные специальные функции; общие сведения о некоторых системных функциях приведены в табл. 10.5.

Кроме того, заслуживает внимания то, что в рассматриваемом коде полученные значения сразу же присваиваются переменным для предотвращения их потери в ходе даль-нейгиего выполнения программы.

Таблица 10.5. Некоторые системные функции, предусмотренные в версии SQL Server 2005

Функция Возвращаемое значение

ERROR NUMBER () Фактический номер ошибки. Если это - системная ошибка, то ей соответствует одна из строк в таблице sysmessages; эта строка содержит часть информации, которая может быть также получена с помощью некоторых других функций, предназначенных для обработки ошибок (для ознакомления с текстом сообщения об ошибке можно воспользоваться таблицей sys .messages)



1 ... 114 115 116 [ 117 ] 118 119 120 ... 346

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика