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)