Атрибуты

Для упрощения работы с объектами базы данных в 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.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: