Возвращение переменных
Тип величины, возвращаемой функцией PL/pgSQL, должен соответствовать типу возвращаемого значения, указанному при создании функции командой CREATE FUNCTION. Значение возвращается командой RETURN. Команда RETURN находится в конце функции, но она также часто встречается в командах IF или других командах, осуществляющих передачу управления в программе. Даже если команда RETURN вызывается в одной из этих команд, функция вес равно должна заканчиваться командой RETURN (даже если управление никогда не будет передано этой завершающей команде). Синтаксис команды RETURN приведен в листинге 11.26.
Листинг 11.26. Синтаксис команды RETURN.
CREATE FUNCTION функция (аргументы) RETURNS тип AS ' DECLARE объявление: […] BEGIN команда: […] RETURN { переменная \ значение } END: ' LANGUAGE 'plpgsql:
Пример использования команды RETURN можно найти в любой функции PL/pgSQL, встречающейся в этой главе.
Атрибуты
Для упрощения работы с объектами базы данных в PL/pgSQL существуют атрибуты переменных – UTYPE и UROWTYPE. Атрибуты требуются для объявления переменной, тип которой совпадает с типом объекта базы данных (атрибут TYPE) или структурой записи (атрибут UROWTYPE). Переменные объявляются с атрибутами в том случае, если они будут использоваться в программном блоке для хранения значений, полученных от объекта базы данных. Таким образом, при объявлении переменной с атрибутом знать тип объекта базы данных не обязательно. Если в будущем тип изменится, то переменная также автоматически переключится на новый тип данных, причем это не потребует дополнительных усилий со стороны программиста.
Атрибут %TYPE
Атрибут %TYPE используется при объявлении переменных с типом данных, совпадающих с типом некоторого объекта базы данных (чаще всего поля). Синтаксис объявления переменной с атрибутом %TYPE приведен в листинге 11.27.
Листинг 11.27. Объявление переменной с атрибутом %TYPE.
переменная таблица_поле%TYPE
В листинге 11.28 приведена функция, использующая атрибут %TYPE для хранения фамилии автора. В ней задействован оператор конкатенации (||), описанный ниже. Команда SELECT INTO рассматривалась ранее в этой главе.
В листинге 11.28 следует обратить особое внимание на атрибут %TYPE. Фактически мы объявляем переменную, тип которой совпадает с типом поля таблицы authors. Затем команда SELECT находит запись, у которой поле first_name совпадает с аргументом, переданным при вызове функции. Команда SELECT читает значение поля last_name этой записи и сохраняет его в переменной l_name. Пример вызова функции с передачей аргумента приведен ниже, в листинге 11.29. Кроме того, передача аргумента пользователем встречается во многих примерах этой главы.
Листинг 11.28. Использование атрибута %TYPE.
CREATE FUNCTION get_author (text) RETURNS text AS ' DECLARE --Объявление псевдонима для аргумента функции. --в котором должно передаваться имя автора, f_name ALIAS FOR $1: --Объявление переменной, тип которой совпадает --с типом поля last_name таблицы authors. I_name authors.lastjiamelTYPE: BEGIN --Найти в таблице authors фамилию автора. --имя которого совпадает с переданным аргументом. --и присвоить ее переменной Ijiame. SELECT INTO Ijiame lastjiame FROM authors WHERE firstjiame – f_name: – Вернуть имя и фамилию, разделенные пробелом, return f_name || '' " || I_name: END: ' LANGUAGE 'plpgsql':
В листинге 11.29 приведен пример вызова функции get_author().
Листинг 11.29. Результат вызова функции get_author().
booktown=# SELECT get_author('Andrew'); get_author Andrew Brook Ins (1 row)