Циклы
Цикл WHILE
Цикл WHILE выполняет блок команд до тех пор, пока заданное условие не станет ложным. При каждой итерации цикла WHILE условие проверяется перед выполнением первой команды блока, и если условие равно TRUE – блок выполняется. Таким образом, если условие никогда не становится равным FALSE, блок выполняется в бесконечном цикле вплоть до принудительного завершения клиентского процесса. Синтаксис цикла WHILE:
[ "метка" ] WHILE условие LOOP команда: […] END LOOP;
В листинге 11.44 циклы WHILE продемонстрированы на примере функции add_two_loop(). Функция увеличивает число на 1 до тех пор, пока не будет достигнуто некоторое пороговое значение. Начальное и конечное значения передаются функции в виде аргументов. Обозначение !=, встречающееся в листинге 11.44, является оператором неравенства. В данном примере условие означает следующее: цикл WHILE продолжает выполняться, пока переменная result не равна переменной highjiumber. Иначе говоря, цикл WHILE завершается в тот момент, когда переменная result становится равной highjiumber.
Листинг 11.44. Использование цикла WHILE.
CREATE FUNCTION add_two_loop (integer, integer) RETURNS integer AS ' DECLARE --Объявление псевдонимов для аргументов. low_number ALIAS FOR $1: highjiumber ALIAS FOR $2: --Объявление переменной для хранения результата, result integer = 0: BEGIN --Увеличивать переменную result на 1 до тех пор. --пока она не станет равна high_number. WHILE result!= highjiumber LOOP result: = result + 1: END LOOP: RETURN result; END: ' LANGUAGE 'plpgsql';
Цикл FOR
Возможно, циклы FOR – самая важная разновидность циклов, реализованных в PL/pgSQL. Цикл FOR выполняет программный блок для целых чисел из заданного интервала. У циклов FOR в PL/pgSQL существуют аналоги в других процедурных языках программирования (например, С).
Заголовок цикла FOR начинается с объявления целочисленной переменной, управляющей выполнением цикла. Затем указывается интервал принимаемых ею значений, а далее следует блок команд. Управляющая переменная уничтожается сразу же после выхода из цикла, причем ее не нужно объявлять в секции объявлений блока. Синтаксис цикла FOR:
[ "метке" ] FOR переменная IN [ REVERSE ] выражение!.. выражение? LOOP команда: […] END LOOP:
Цикл FOR выполняет одну итерацию для каждого значения переменной переменная в интервале, границы которого определяются выражениями выражение! и выражекие2 (включительно). В начале цикла переменная инициализируется значением выражения выражение! и увеличивается на 1 после каждой итерации. Если в заголовке цикла присутствует ключевое слово REVERSE, то переменная не увеличивается, а уменьшается.
Примечание
Управляющую переменную цикла не обязательно объявлять вне блока FOR, если вы не собираетесь работать с ней после завершения цикла.