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

Возвращение переменных

Атрибут %ROWTYPE

Атрибут %ROWTYPE используется в PL/pgSQL для переменной-записи, имеющей одинаковую структуру с записями заданной таблицы. Не путайте атрибут %ROWTYPE с типом данных RECORD – переменная с атрибутом %ROTWTYPE точно воспроизводит структуру записи конкретной таблицы, а переменная RECORD не структурирована и ей можно присвоить запись любой таблицы.

В листинге 11.30 приведена перегруженная версия функции get_author() (см. листинг 11.28). Она делает то же, что и прототип, но получает аргумент типа integer вместо text и ищет автора, сравнивая код с переданным аргументом.

Обратите внимание: в реализации функции используется переменная, объявленная с атрибутом %ROWTYPE. Возможно, в данном случае применение %ROWTYPE только напрасно усложняет очень простую задачу, но по мере изучения PL/pgSQL важность атрибута %ROWTYPE становится все более очевидной.

Точка (.) после имени переменной found_author в листинге 11.30 используется для ссылки на имя поля, входящего в структуру found_author.

Листинг 11.30. Использование атрибута %ROWTYPE.

CREATE FUNCTION get_author (integer) RETURNS text AS '
DECLARE
--Объявление псевдонима для аргумента функции.
--в котором должен передаваться код автора,
author Jd ALIAS FOR $1:
--Объявление переменной, структура которой
--совпадает со структурой таблицы authors,
found author authors ROWTYPE:
BEGIN
--Найти в таблице authors фамилию автора.
--код которого совпадает с переданным аргументом.
SELECT INTO found_author * FROM authors WHERE id = authorjd:
--Вернуть имя и фамилию, разделенные пробелом.
RETURN found_author.first_name || " " || found_author.last_name:
END:
' LANGUAGE 'plpgsql':

Обратите внимание па звездочку (*) в списке полей команды SELECT. Поскольку переменная found_author объявлялась с атрибутом %ROWTYPE для таблицы authors, она имеет такую же структуру, как и записи таблицы authors. Таким образом, конструкция SELECT * заполняет переменную found_author значениями полей найденной записи. Пример вызова новой версии get_author() приведен в листинге 11.31.

Листинг 11.31. Вызов новой версии функции get_author().

booktown=# SELECT get_author(1212): get_author
John Worsley
(1 row)
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.