Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Введение в СУБД HyTech.doc
Скачиваний:
11
Добавлен:
01.03.2025
Размер:
2.67 Mб
Скачать

Оператор цикла с постусловием

В операторе do (операторе цикла с постусловием) процесс циклического выполнения вычислений организуется следующим образом. Выполняется оператор внутри цикла, затем вычисляется значение условия цикла. Если вычисленное значение отлично от нуля, то выполнение цикла продолжается. Если вычисленное значение равно нулю, то выполнение цикла прекращается и управление передается оператору, расположенному непосредственно после оператора цикла. В отличие от оператора while, в операторе do цикл выполняется хотя бы один раз.

Формат:

do Оператор_цикла while ( Условие );

Аргументы:

Аргумент

Значение

Условие

Логическое выражение, значение которого проверяется после очередной итерации.

Оператор_цикла

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

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

Цикл do завершается в следующих случаях:

  • Значение условного выражения обратилось в нуль;

  • В теле цикла встретился оператор break;

  • В теле цикла встретился оператор return;

  • В теле цикла встретился оператор quit.

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

Примеры:

var @sum01 = 0, @num = 1, @N = 3; do {   @sum01 = @sum01 + @num;   @num = @num + 1; } while(@num < @N); var @sum02 = 0; @num = 1; do {   @sum02 = @sum02 + @num;   @num = @num + 1;   if (@sum02 > 4)     break; } while(1); select @sum01 as SUM01, @sum02 as SUM02 from TABLES;

Переход к выполнению очередной итерации цикла

Оператор continue прекращает выполнение текущей итерации оператора цикла (do или while) и передает управление в начало цикла для выполнения очередной итерации (для цикла while) или в конец цикла на проверку условия (для цикла do).

Формат:

continue;

Пример:

Выполнить некоторый код 10 раз. Функция gettick возвращает время в тиках (1/18 сек), а функция delay задерживает процесс на заданное число секунд.

var @i = 0; var @r = ''; while(@i < 10) {   @i = @i + 1;   @r = @r + 'Итерация: ' + @i + ' ' + gettick() + '; ';   delay(1);   continue;   // Код, размещенный здесь, никогда не будет выполнен. };

4.5 Хранимые процедуры и функции Хранимые процедуры

Хранимая процедура – это программа, написанная на языке SQL и хранящаяся на SQL сервере как часть данных в виде некоторого объекта с указанным именем. По имени процедуру можно вызвать для выполнения и получить от нее результат. Как и на другие объекты базы данных, на процедуру распространяется механизм прав использования.

SQL оператор create procedure создает новую процедуру, которая сохраняется на сервере. Оператор не описывает создаваемую процедуру, а реально создает ее, занося информацию о процедуре в базу данных. Запрос на создание процедуры, полученный от пользователя, компилируется, затем компонуется с процедурами, используемыми в запросе, и, наконец, выполняется. Процедуру, которая будет создаваться в запросе, в этом запросе вызвать нельзя – во время компоновки процедура еще отсутствует в базе данных.

Формат:

create procedure Имя_процедуры ( [ Параметр , ...] )        [ user { current | default } ] as        [ Определение_локальных_переменных ... ] begin          { Тело_процедуры }; end; 

Параметр ::=   Имя_параметра [ in | out | inout ]

Определение_локальных_переменных ::=   declare variable Имя_переменной [ = Выражение ], ...;

Аргументы:

Аргумент

Значение

Имя_процедуры

Задает имя процедуры. Имя процедуры должно содержать буквы и цифры, должно начинаться с буквы и должно быть не длиннее 31 символа. Имена процедур должны быть уникальными и не должны совпадать с зарезервированными словами.

Параметры

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

Тело процедуры

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

user current

Необязательный параметр, который задает права, которые будут использоваться внутри процедуры. Если задана конструкция user current, то внутри процедуры действуют права пользователя, который создал процедуру.

user default

Необязательный параметр, который задает права, которые будут использоваться внутри процедуры. Если задана конструкция user default, то внутри процедуры будут действовать права, действовавшие до вызова процедуры.

Определение_локальных_переменных

См. подробнее в разделе «Переменные».

Ограничения:

  • Максимальное количество параметров в процедуре – 31;

  • Параметры, передаваемые по ссылке, нельзя использовать в запросах внутри процедуры, в частности в конструкции where. Чтобы обойти это ограничение, достаточно объявить в процедуре локальную переменную и присвоить ей значение параметра. Эту локальную переменную и следует использовать в запросах. 

Пример:

Создать процедуру, которая вычисляет факториал от некоторого числа.

create procedure scFact(x) as declare variable @i = 1, @f = 1; {   while(@i <= x)   {     @f = @f * @i;     @i = @i + 1;   }   return @f; };

SQL оператор drop procedure удаляет существующую процедуру. Удаляемая процедура задается своим именем.

Формат:

drop procedure Имя_процедуры [ cascade | restrict ];

Аргументы:

Аргумент

Значение

Имя_процедуры

Задает имя удаляемой процедуры. Процедура с указанным именем должна быть создана оператором create procedure.

cascade

Если задано ключевое слово cascade, то при удалении процедуры удалятся и все связанные с ней объекты. В текущей реализации таких объектов нет.

restrict

Если указано ключевое слово restrict и есть связанные с процедурой объекты, то операция завершится с ошибкой.

Пример:

Удалить процедуру scFact со всеми объектами:

drop procedure scFact cascade;