Атрибуты
Для упрощения работы с объектами базы данных в PL/pgSQL существуют атрибуты переменных - %TYРЕ и %ROWTYPE. Атрибуты требуются для объявления переменной, тип которой совпадает с типом объекта базы данных (атрибут %TYРЕ) или структурой записи (атрибут %ROWTYPE). Переменные объявляются с атрибутами в том случае, если они будут использоваться в программном блоке для хранения значений, полученных от объекта базы данных. Таким образом, при объявлении переменной с атрибутом знать тип объекта базы данных не обязательно. Если в будущем тип изменится, то переменная также автоматически переключится на новый тип данных, причем это не потребует дополнительных усилий со стороны программиста.
6.1.5.1 Атрибут %TYPE
Атрибут %TYPE используется при объявлении переменных с типом данных, совпадающих с типом некоторого объекта базы данных (чаще всего поля). Синтаксис объявления переменной с атрибутом %TYPE приведен в листинге 6.21.
Листинг 6.21. Объявление переменной с атрибутом %TYPE
переменная таблица.поле%ТУРЕ
В листинге 6.22 приведена функция, использующая атрибут %TYPE для хранения фамилии автора. В ней задействован оператор конкатенации (||), описанный ниже. Команда SELECT INTO рассматривалась ранее в этой главе.
В листинге 6.22 следует обратить особое внимание на атрибут %TYРЕ. Фактически мы объявляем переменную, тип которой совпадает с типом поля таблицы authors. Затем команда SELECT находит запись, у которой поле first_name совпадает с аргументом, переданным при вызове функции. Команда SELECT читает значение поля last_name этой записи и сохраняет его в переменной l_паmе. Пример вызова функции с передачей аргумента приведен ниже, в листинге 6.23. Кроме того, передача аргумента пользователем встречается во многих примерах этой главы.
Листинг 6.22. Использование атрибута %TYPE
CREATE OR REPLACE FUNCTION books.get_author_txt(text)
RETURNS text AS
$BODY$
DECLARE
-- Объявление псевдонима для аргумента функции,
-- в котором должно передаваться имя автора.
f_name ALIAS FOR $1;
-- Объявление переменной, тип которой совпадает
-- с типом поля last_name таблицы authors.
l_name books.authors.last_name%TYPE;
BEGIN
-- Найти в таблице authors фамилию автора,
-- имя которого совпадает с переданным аргументом
-- и присвоить ее переменной l_name.
SELECT INTO l_name last_name
FROM books.authors
WHERE first_name = f_name;
-- Вернуть имя и фамилию, разделенные пробелом.
return f_name || ' ' || l_name;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
В листинге 6.23 приведен пример вызова функции get_author().
Листинг 6.23. Результат вызова функции get_author_txt()
SELECT books.get_author_txt('Richard');
Ответ: Richard Brautigan.
6.1.5.2 Атрибут %ROWTYPE
Атрибут %ROWTYPE используется в PL/pgSQL для переменной-записи, имеющей одинаковую структуру с записями заданной таблицы. Не путайте атрибут %ROWTYPE с типом данных RECORD - переменная с атрибутом ROWTYPE точно воспроизводит структуру записи конкретной таблицы, а переменная RECORD не структурирована и ей можно присвоить запись любой таблицы.
В листинге 6.24 приведена перегруженная версия функции get_author() (см. листинг 6.22). Она делает то же, что и прототип, но получает аргумент типа integer вместо text и ищет автора, сравнивая код с переданным аргументом.
Обратите внимание: в реализации функции используется переменная, объявленная с атрибутом %ROWTYPE. Возможно, в данном случае применение %ROWTYPE только напрасно усложняет очень простую задачу, но по мере изучения PL/pgSQL важность атрибута %ROWTYPE становится все более очевидной.
Точка (.) после имени переменной found_author в листинге 6.24 используется для ссылки на имя поля, входящего в структуру found_author.
Листинг 6.24. Использование атрибута %ROWTYPE
CREATE OR REPLACE FUNCTION books.get_author_int(integer)
RETURNS text AS
$BODY$
DECLARE
-- Объявление псевдонима для аргумента функции.
-- в котором должен передаваться код автора,
author_id ALIAS FOR $1;
-- Объявление переменной, структура которой
-- совпадает со структурой таблицы authors.
found_author books.authors%ROWTYPE;
BEGIN
-- Найти в таблице authors фамилию автора,
-- код которого совпадает с переданным аргументом.
SELECT INTO found_author * FROM books.authors WHERE id = author_id;
-- Вернуть имя и фамилию, разделенные пробелом.
RETURN found_author.first_name || ' ' || found_author.last_name;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
Обратите внимание на звездочку (*) в списке полей команды SELECT. Поскольку переменная found_author объявлялась с атрибутом %ROWTYPE для таблицы authors, она имеет такую же структуру, как и записи таблицы authors. Таким образом, конструкция SELECT * заполняет переменную found_author значениями полей найденной записи. Пример вызова новой версии get_author() приведен в листинге 6.25.
Листинг 6.25. Вызов новой версии функции get_author_int()
SELECT books.get_author_int(1111);
Ответ: Denham Ariel.
Дата добавления: 2015-02-03; просмотров: 884;