Возвращение переменных
Атрибут %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)