Циклы
Циклы 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':