CREATE FUNCTION
Определение новой функции в базе данных.
Синтаксис
CREATE FUNCTION имя ( [ тип_аргумента [. ...] ] )
RETURNS тип_возвращаемого_значения
AS 'определение'
LANGUAGE 'язык'
[ WITH ( атрибут [. ...] ) ]
CREATE FUNCTION имя ( [ тип_аргумента [. ...] ] )
RETURNS тип_возвращаемого_значения
AS 'объектный_файл' [ , 'иия_в_обьектном_файпе' ]
LANGUAGE 'язык'
[ WITH ( атрибут [. ..;] ) ]
Параметры
- имя. Имя создаваемой функции.
- тип_аргумента. Тип данных аргумента (или аргументов), получаемого
функцией. Существуют три категории типов данных: базовые типы, сложные
типы и специальный тип opaque. Тип opaque разрешает передачу аргументов,
не относящихся к допустимым типам SQL. Обычно он используется внутренними
функциями, а также функциями, написанными на языках С, PL/pgSQL и т.
д., в которых возвращаемое значение не относится к стандартным типам
данных SQL.
- тип_возвращаемого_значения. Тип данных возвращаемого значения (или
значений) функции. Может относиться к базовому типу, сложному типу,
типу setof (обычный тип данных с префиксом setof) или типу opaque. Модификатор
setof указывает на то, что функция возвращает несколько записей данных
(по умолчанию возвращается только одна запись). Например, тип возвращаемого
значения setof i nteger создает функцию, которая может возвращать несколько
записей типа integer.
- атрибут. Необязательный атрибут функции. В PostgreSQL 7.1.x поддерживаются
два атрибута, isstrict и iscacheable.
- определение. Определение создаваемой функции. Задается в виде строки,
заключенной в апострофы, хотя ее содержимое в значительной мере зависит
от языка программирования. В строке может передаваться внутреннее имя
функции, команда SQL или процедурный код (в таких языках, как PL/pgSQL).
- объектный_файл [ , имя_в_объектном_файле ]. Файл, содержащий динамически
загружаемый объектный код, и имя функции в исходном коде на языке С.
Второй параметр обязателен лишь в том случае, если имя исходной функции
на языке С отличается от имени функции SQL.
- язык. Название языка, на котором написана функция. Допустимыми значениями
являются С, SQL, Internal или имя любого процедурного языка, поддержка
которого была установлена командой CREATE LANGUAGE (например, plpgsql).
За дополнительной информацией обращайтесь к описанию команды CREATE
LANGUAGE.
Результаты
CREATE. Это сообщение возвращается при успешном создании функции.
Описание
Команда CREATE FUNCTION создает новую функцию в текущей базе данных.
Владельцем функции становится создавший ее пользователь PostgreSQL.
Атрибуты функции
- iscachable. Атрибут означает, что функция всегда возвращает постоянный
результат при одинаковых значениях аргументов (то есть вычисленные результаты
могут кэшироваться). Такие функции не берут информацию из базы данных
и не используют информацию, не включенную в список параметров. По значению
атрибута оптимизатор узнает о том, что вместо повторного выполнения
функции можно воспользоваться результатом предыдущего вызова с теми
же аргументами.
- isstrict. Атрибут Isstrict означает, что в функции реализована жесткая
проверка псевдозначений NULL. В этом случае при вызове с аргументом
NULL функция не выполняет никаких действий и сразу возвращает результат
NULL.
Перегрузка функций
В PostgreSQL поддерживается перегрузка функций. Вероятно, этот термин
хорошо знаком всем программистам, работающим с объектно-ориентированными
языками — под ним понимается определение нескольких функций с одинаковыми
именами при условии, что каждая из них получает уникальный набор аргументов.
Перегрузка создает видимость того, что одна функция работает с разными
типами входных данных. С точки зрения пользователя серия функций превращается
в универсальное и удобное средство для выполнения конкретной задачи.
В отличие от функций PostgreSQL, перегружаемых по типам аргументов,
откомпилированные функции С, находящиеся в одном объектном файле, не могут
обладать одинаковыми именами. Чтобы справиться с этой проблемой, присвойте
второй функции С, которую вы собираетесь перегрузить в PostgreSQL, любое
уникальное имя в исходном файле С, откомпилируйте и затем передайте это
имя в параметре имя_в_объектном_файле при создании перегруженной функции.
Примеры
В следующем примере создается простая функция SQL, которая возвращает
название книги по ее коду, переданному функции:
booktown=# CREATE FUNCTION title(integer) RETURNS text
booktown-# AS 'SELECT title from books where id - $1'
booktown-# LANGUAGE 'sql':
CREATE
Теперь функция title() может использоваться в базе данных booktown для
выборки записей, у которых поле id совпадает с переданным числовым аргументом:
booktown=# SELECT title(41472) AS book_title;
book title
Practical PostgreSQL
(1 row) |