Операторные скобки BEGIN END
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

 

В некоторых случаях в сценарии T-SQL появляется необходимость указать, что группа следующих друг за другом операторов должна выполняться как единое целое. Это делается с помощью оператора BEGIN END. На рис. 13.11 приведен сценарий, демонстрирующий применение оператора BEGIN END.

 

Рис. 13.11. Сценарий, демонстрирующий применение
операторных скобок BEGIN END

 

Сценарий на рис. 13.11 состоит из двух пакетов. В первом пакете с помощью BEGIN END создано три блока операторов. Причем первый блок включает в себя два других: второй и третий. Необходимо обратить внимание на следующее.

1. Оператор RETURN, выполненный во внутреннем блоке (на рис. 13.11 – блок 3), осуществляет выход из пакета (пакет 1).

2. Область видимости переменной, объявленной внутри блока (переменная @ x 3 в блоке 2), распространяется на следующие блоки (блок 3) и внешний блок (блок 1).

Другими словами, объединение операторов T-SQL в блоки с помощью BEGIN END никак не влияет на действие оператора RETURN (в любом случае осуществляется выход из пакета) и на область видимости переменных (область видимости распространяется строго сверху вниз).

 


Оператор WHILE

 

Оператор WHILE предназначен для организации программного цикла. Принцип работы оператора WHILE такой же, как в большинстве алгоритмических языков (например C++, Java).

Оператор WHILE содержит две составляющие: логическое выражение и тело цикла. Логическое выражение определяет условие выполнения тела цикла. Тело цикла содержит один или более операторов, которые выполняются в том случае и до тех пор, пока логическое выражение принимает значение «истина».

На рис. 13.2 приведен сценарий, демонстрирующий работу оператора WHILE. Заметим, что тело цикла содержит только один оператор.

Рис. 13.12. Пример использования простейшего оператора WHILE
с телом цикла, содержащим один оператор

 

В том случае, если тело цикла содержит более, чем один оператор, следует применять операторные скобки BEGIN END (рис. 13.13).

На рис. 13.13 предлагается пример более сложного сценария, применяющего WHILE-цикл для итеративного обновления строк таблицы AUDITORIUM. В каждой итерации цикла осуществляется увеличение числовых значений столбца AUDITORIUM_ CAPACITY в строках таблицы AUDITORIUM. Условием завершения цикла является достижение суммарного значения, превышающего 1500 в столбце AUDITORIUM.

Рис. 13.12. Пример использования простейшего оператора WHILE с телом цикла, содержащим более, чем один оператор

 

Заметим, без процедурных возможностей Т-SQL, используя только «чистый» SQL, реализовать алгоритм, запрограммированный в сценарии на рис. 13.13, невозможно.

Рис. 13.13. Пример использования оператора WHILE для итеративного изменения строк таблицы AUDITORUIM

Обратите внимание на оператор SET NOCOUNT, расположенный в начале сценария на рис. 13.13. Значение ON, указанное в этом операторе, позволяет предотвратить вывод в стандартный выходной поток формируемых по умолчанию информационных сообщений сервера о количестве обработанных DML-операторами строк.

Управление выполнением WHILE-цикла может осуществляться с помощью инструкций BREAK и CONTINUE. На рис. 13.14 представлен пример, демонстрирующий использование этих инструкций.

 

Рис. 13.14. Пример использования инструкций BREAK и CONTINUE

 

Инструкция CONTINUE (рис. 13.14) прерывает выполнение блока операторов в теле WHILE и передает управление в начало цикла. Если в теле цикла выполнилась инструкция BREAK, работа цикла прекращается и управление передается следующему за WHILE оператору.

 


Оператор IF

 

Оператор ветвления IF позволяет в зависимости от значения логического выражения выполнять или не выполнять оператор или блок операторов сценария T-SQL. Примеры использования простейшей конструкции оператора IF приведены в сценарии на рис. 13.15.

 

Рис. 13.15. Пример использования простейшей конструкции оператора IF

 

За логическим выражением оператора IF располагается оператор, выполняющийся в случае истинности значения логического выражения (рис. 13.15). Если при этом требуется выполнить оператор при альтернативном значении логического выражения, следует применить конструкцию IF ELSE (13.16).

 

Рис. 13.16. Пример использования конструкции IF ELSE

 

В сценарии на рис. 13.16 последовательно выполняются все операторы IF и соответственно вычисляются все значения логических выражений. В каждом операторе IF в зависимости от принимаемого логическим выражением значения выполняется тот или иной оператор PRINT.

Сократить количество вычислений значений логических выражений позволяет конструкция IF ELSE IF, в которой проверка осуществляется только в ветке ELSE оператора IF (рис. 13.7).

 

Рис. 13.17. Пример использования конструкции IF ELSE IF

 

Заметим, что в рассмотренных примерах (рис. 13.16, 13.17) при истинном или альтернативном значении логического выражения оператора IF выполняется только один оператор. Для выполнения нескольких операторов применяются операторные скобки (рис. 13.18).

 

Рис. 13.18. Пример использования операторных скобок BEGIN END
 в операторе IF

 

На рис. 13.19 представлен сценарий, демонстрирующий более сложные логические выражения, которые могут применяться в операторе IF.

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

Логическое выражение второго оператора IF (рис. 13.19) примет истинное значение, если в столбце SUBJECT одноименной таблицы есть хотя бы одно значение БД.

В третьем операторе IF (рис. 13.19) сравнивается максимальное значение даты из столбца PDATE таблицы PROGRESS с заданным с помощью операцией BETWEEN отрезком (границы включаются) дат. Причем правая граница отрезка задается значением переменной, проинициализированной функцией GETDATE (возвращает текущую дату и время), а левая – вычисленным с помощью функцией DATEADD значением.

 

 

Рис. 13.19. Примеры логических выражений, используемых в операторе IF

 


Выражение CASE

 

Выражение CASE, как правило, применяется в операторе SELECT (в SELECT-списке, секциях WHERE, ORDER BY, HAVING) и служит для формирования одного из нескольких возможных значений. Может применяться в операторах UPDATE (в секциях SET и WHERE), DELETE (в секции WHERE). Выражение CASE имеет два формата: первый сравнивает результат одного выражения со списком заданных значений, второй – вычисляет набор логических выражений.

На рис. 13.20 представлен составной SELECT-запрос, использующий выражение CASE первого формата в SELECT-списке и в секции GROUP BY внутреннего запроса, а также в секции ORDER BY внешнего запроса.

Сразу за ключевым словом CASE (рис. 13.20) следует вычисляемое выражение (в нашем случае – это просто значения из столбца NOTE таблицы PROGRESS или из столбца Категория оценки результирующего набора внутреннего запроса), а далее одно или более предложений WHEN, содержащих значения для сравнений. Ключевое слово THEN, присутствующее в каждом предложении WHEN, указывает на один из возможных (соответствующих значению) результатов, формируемых CASE. Список WHEN-предложений завершается предложением ELSE, содержащим результат выражения CASE, формируемого в случае безуспешного сравнения значения исходного выражения со всеми предшествующими WHEN-значениями.

Обратите внимание на применение выражения CASE в секциях GROUP BY и ORDER BY.

Применение CASE в GROUP BY позволяет формировать группы строк на основе заданного в этом выражении условия. В примере на рис. 13.20 в зависимости от значений в столбце NOTE строки таблицы PROGRESS разбиваются на четыре группы (в первой группе нет ни одной строки), соответствующие четырем возможным результатам выражения CASE.

 

Рис. 13.20. Пример использования выражения CASE первого формата

 

Выражение CASE в ORDER BY позволяет динамически формировать значения ключей сортировки. В примере на рис. 13.20 с помощью CASE в результате сортировки строка результирующего набора внутреннего запроса со значением превосходно в столбце Категория оценки будет первой (ключ сортировки 0), со значением отлично (ключ сортировка 1) и т. д.

Пример на рис. 13.21 демонстрирует применение выражения CASE второго формата в SELECT-списке и секции GROUP BY запроса SELECT.

 

Рис. 13.21. Пример использования выражения CASE второго формата

Обратите внимание: каждое предложение WHEN содержит логическое выражение. Логические выражения проверяются на истинность сверху вниз, и при первом успешном сравнении формируется результирующее значение, указанное за ключевым словом THEN. В том случае, если ни одно из логических WHEN-выражений не принимает истинного значения, в качестве результата CASE формируется значение, указанное в предложении ELSE.

 

Оператор WAITFOR

 

С помощью оператора WAITFOR можно приостановить выполнение пакета. Оператор работает в двух режимах: DELAY и TIME.

В режиме DELAY оператор WAITFOR приостанавливает выполнение пакета на заданный интервал времени. В сценарии, представленном на рис. 13.22, демонстрируется выполнение оператора WAITFOR в режиме DELAY.

Рис. 13.22. Пример использования оператора WAITFOR в режиме DELAY

 

В сценарии (рис. 13.22) последовательно выполняются два оператора WAITFOR DELAY. Первый приостанавливает выполнение пакета на 2 с, второй на 3 с. Обратите внимание на то, что во втором операторе время задается значением переменной, имеющей тип DATETIME и проинициализированной в операторе DECLARE с помощью строкового литерала. При анализе (рис. 13.23) значения переменной заметим, что ее значение соответствует дате 01.01.1900 и времени 0 ч 0 мин и 3 с. Следует помнить, что при вычислении интервала задержки в операторе WAITFOR DELAY используется разница между текущим и значением по умолчанию типа DATETIME (01.01.1900 00:00:00).

 

Рис. 13.23. Представление интервала времени с помощью типа DATETIME

 

В примере на рис. 13.24 используется оператор WAIFOR в режиме TIME. В этом режиме можно приостановить выполнение потока до наступления заданного значения системного времени на сервере.

Рис. 13.24. Пример использования оператора WAITFOR в режиме TIME

 

В сценарии на рис. 13.24 последовательно выполняются два оператора WAITFOR TIME. Каждый из них приостанавливает выполнение пакета до момента времени, указанного значением переменной. Обратите внимание: переменным при инициализации устанавливается значение с помощью встроенной функции SYSTEMDATETIME, возвращающей текущее системное время сервера MSS. При этом переменной, применяемой в первом операторе, устанавливается время со смещением в 2 с относительно текущего времени, для переменной, используемой вторым оператором, – со смещением в 3 с.

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

 

Для обработки ошибок выполнения в сценарии T-SQL предусмотрена конструкция, состоящая их двух блоков: TRY и CATCH. При этом блок TRY содержит код T-SQL, в котором могут возникнуть ошибки (говорят – охраняемый код), а блок CATCH – код, предназначенный для обработки ошибок. Ошибка, возникающая в охраняемом коде, приводит к немедленной передаче управления в блок обработки ошибок.

На рис. 13.25 представлен пример сценария, демонстрирующего применение механизма TRY/CATCH для обработки ошибки, возникающей при делении на нуль. С помощью трех операторов PRINT осуществляется трассировка хода выполнения сценария.

Рис. 13.25. Обработка ошибки с помощью механизма TRY/CATCH

Обратите внимание: второй оператор PRINT не выполняется, так как ошибка, возникшая при попытке деления на нуль, привела к немедленной передаче управления в блок обработки ошибок.

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

 

Таблица 13.1

Дата: 2019-02-25, просмотров: 230.