Циклы
В листинге 11.46 приведена другая функция, в которой цикл FOR используется для перебора результатов запроса SQL. При каждой итерации цикла FOR в листинге 11.46 содержимое одной из записей запроса к таблице books помещается в переменную row_data, после чего значение поля title присваивается переменной text_output.
Цикл продолжается до тех пор, пока не будет достигнута последняя запись в таблице books. В конце цикла переменная text_output содержит полный список всех книг по теме, код которой был передан в аргументе функции. Работа функции завершается возвращением переменной text_output.
Листинг 11.46. Использование цикла FOR с атрибутом %ROWTYPE.
CREATE FUNCTION extract_title (integer) RETURNS text AS ' DECLARE --Объявление псевдонима для аргумента функции, subjd ALIAS FOR $1: --Объявление переменной для хранения названий книг. --Переменная инициализируется символом новой строки, text output text: = ''\n''; --Обьявление переменной для хранения записей --таблицы books, row data booksXROWTYPE: BEGIN --Перебор результатов запроса. FOR rowjata IN SELECT * FROM books WHERE subjectjd = subjd ORDER BY title LOOP --Присоединить название книги к переменной text_output. text_output: = text_output || row_data.title || "\n"; END LOOP: --Вернуть список книг. RETURN text_output: END: ' LANGUAGE 'plpgsql':
В листинге 11.47 показан результат вызова функции extract_title() с аргументом 2. В таблице subjects этот код соответствует теме "Children's Books" (книги для детей).
Листинг 11.47. Результат выполнения функции extract_title().
booktown=# SELECT extract_title(2); extract_title Bartholomew and the Oobleck Franklin in the Dark Goodnight Moon The Cat in the Hat (1 row)
Переменная row_data объявляется с атрибутом UROWTYPE no отношению к таблице books, поскольку она будет использоваться только для хранения записей из таблицы books. С таким же успехом можно было объявить row_data с типом RECORD:
rowjata RECORD:
Впрочем, это следует делать только в том случае, если в переменной предполагается хранить записи из нескольких таблиц.
Функция extract_title() возвращает одинаковые результаты как при объявлении переменной с типом RECORD, так и с атрибутом &ROWTYPE.