Безусловный цикл
Ключевое слово LOOP начинает простейший безусловный цикл. Команды безусловного цикла выполняются до тех пор, пока не будет достигнуто ключевое слово EXIT. За ключевым словом EXIT может следовать секция WHEN с выражением, определяющим условие выхода. Выражение должно относиться к логическому типу. Например, оно может проверять, достигла ли переменная некоторой величины. Ниже приведен синтаксис безусловного цикла (без ключевого слова LOOP):
LOOP
команда;
[...]
END LOOP;
Команда EXIT завершает работу безусловного цикла и может дополнительно содержать метку и/или условие завершения.
Метка представляет собой произвольный идентификатор, заключенный между «префиксом и суффиксом». Чтобы назначить метку циклу, следует расположить ее непосредственно перед началом цикла. Синтаксис определения цикла с меткой:
«метка»
LOOP
[...]
END LOOP;
Назначение метки циклу позволяет указать нужный цикл при выходе из нескольких вложенных циклов (команда EXIT с меткой работает лишь в том случае, если завершаемому циклу была присвоена соответствующая метка).
Если команда EXIT содержит условие, цикл прерывается только в том случае, если это условие истинно.
Синтаксис вызова EXIT в цикле LOOP:
[ «метка» ]
LOOP
statement;
[...]
EXIT [ метка ] [ WHEN условие ];
END LOOP;
В листинге 6.35 приведен пример безусловного цикла и команды EXIT, завершающей цикл при выполнении некоторого условия. Функция square_integer_loop() возводит целое число в квадрат (умножает его само на себя) до тех пор, пока его значение не превысит 10 000, после чего возвращает полученный результат.
Листинг 6.35. Использование безусловного цикла
CREATE OR REPLACE FUNCTION books.square_integer_loop(integer)
RETURNS integer AS
$BODY$
DECLARE
-- Объявление псевдонима для аргумента.
numl ALIAS FOR $1;
-- Объявление целочисленной переменной для хранения результата.
result integer;
BEGIN
-- Исходное число присваивается переменной.
result := numl;
LOOP
result := result * result;
EXIT WHEN result >= 10000;
END LOOP;
RETURN result;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
В листинге 6.36 показан результат вызова square_integer_loop() с аргументом 3.
Листинг 6.36. Результат вызова функции square_integer_loop()
SELECT books.square_integer_loop(4);
Ответ: 65536.
Дата добавления: 2015-02-03; просмотров: 1343;