Иллюстрированный самоучитель по PostgreSQL

Циклы

Циклы FOR также используются для перебора результатов запросов. Пример приведен в листинге 11.45, где цикл FOR работает с переменными RECORD и &ROWTYPE. Синтаксис цикла FOR с перебором записей:

[ "метка" ]
FOR { переменная_record %переменная_rowtype } IN комманда_select LOOP
команда:
[…]
END LOOP:

В листинге 11.45 функция extract_all_titles() получает из базы данных список всех названий книг, упорядоченных по теме. Если по какой-либо теме в базе данных не находится ни одной книги, выводится пустая строка. Список возвращается в виде текстовой переменной. Перебор тем по кодам в функции extract_all_titles() осуществляется в цикле FOR.

Внутри первого цикла FOR находится другой, вложенный цикл FOR. Он перебирает все книги в базе данных и отбирает те из них, у которых поле subject_id совпадает с управляющей переменной исходного цикла (текущим кодом темы). В листинге 11.45 управляющая переменная i инициализируется нулевым значением, поскольку нумерация кодов тем в таблице subjects начинается с 0.

Листинг 11.45. Пример использования цикла FOR.

CREATE FUNCTION extract_all __titles2 () RETURNS text AS '
DECLARE
--Объявление переменной для кода темы .sub_id integer;
--Объявление переменной для хранения списка названий книг.
text_output text =:
--Объявление переменной для названия темы.
sub_title text;
--Объявление переменной для хранения записей.
--полученных при выборке из таблицы books.
row_data booksSSROWTYPE: BEGIN
--Внешний цикл FOR: тело цикла выполняется до тех пор.
--пока переменная 1 не станет равна 15. Перебор начинается с 0.
--Следовательно, тело цикла будет выполнено 16 раз
--(по одному пля каждой темы).
FOR i IN 0..15 LOOP
--Получить из таблицы subjects название темы.
--код которой совпадает со значением переменной 1.
SELECT INTO sub_title subject FROM subjects WHERE id = 1:
--Присоединить название темы, двоеточие и символ новой строки
--к переменной text_output.
text_output = text_output || "\n" | sub_title | ":\n";
--Перебрать все записи таблицы books.
--у которых код темы совпадает со значением переменной 1.
FOR row_data IN SELECT * FROM books
WHERE subjectjd = i LOOP
--Присоединить к переменной text_output название книги
--и символ новой строки.
text_output: = text_output || row_data.title || "\n":
END LOOP;
END LOOP:
--Вернуть список.
RETURN text_output;
END:
' LANGUAGE 'plpgsql':
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.