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

Циклы

В листинге 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.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.