CREATE AGGREGATE
CREATE AGGREGATE
Определение новой агрегатной функции в базе данных.
Синтаксис
CREATE AGGREGATE имя ( BASETYPE = входной_тип
[ , SFUNC = функция. STYPE = переходный_тип ]
[ , FINALFUNC = завершающая_функция ]
[ , INITCOND = начальное_состояние ] )
Параметры
- имя. Имя создаваемой агрегатной функции.
- входной_тип. Тип входных данных, с которыми работает создаваемая функция. Если агрегатная функция игнорирует входные данные (как, например, функция count()), вместо типа данных указывается строковая константа ANY.
- функция. Имя функции, вызываемой для обработки всех входных данных, отличных от NULL. Обычно такая функция получает два аргумента: первый аргумент относится к типу данных переходный_тип, а второй — к типу данных входной_тип. Если агрегатная функция не анализирует входные данные, она получает только один аргумент типа переходный_тип. Так или иначе, функция должна возвращать значение типа переходный_тип.
- переходный_тип. Промежуточный тип данных агрегатной функции.
- завершающая_функция. Имя итоговой функции, вызываемой для вычисления результата агрегатной функции после обработки всех входных данных. Функция должна получать один аргумент типа переходный_тип. Выходной тип данных агрегатной функции определяется типом возвращаемого значения этой функции. Если параметр FINALFUNC не указан, то последнее переходное значение передается в качестве результата агрегатной функции, а выходной тип данных определяется типом переходный_тип.
- начальное_состояние. Начальное состояние промежуточного значения агрегатной функции. Задается литералом типа переходный_тип. Если параметр начальное_состояние не задан, промежуточное значение инициализируется псевдозначением NULL.
Результаты
- CREATE. Сообщение выдается при успешном создании агрегатной функции.
- ERROR: AggregateCreate: function "функция(переходпый_тип. входной_тип)" does not exist. Ошибка — заданная функция с двумя параметрами типов переходный_тип и входной_тип не существует.
- ERROR: AggregateCreate: function "функция(переходпый_тип)" does not exist. Ошибка — заданная функция с одним параметром типа переходный_тип не существует. Сообщение выдается только в том случае, если параметр входной_ тип равен ANY.
Описание
Команда CREATE AGGREGATE предназначена для определения новых агрегатных функций в PostgreSQL Самые распространенные агрегатные функции (min(), avg(), max() и т. д.) принадлежат к числу стандартных функций PostgreSQL. За дополнительной информацией о стандартных функциях PostgreSQL обращайтесь к главе 5.
Агрегатные функции характеризуются в первую очередь типом входных данных. Допускается существование двух и более агрегатных функций с одинаковыми именами, вызываемых с разными типами данных (это называется перегрузкой функций).
ВНИМАНИЕ
Во избежание недоразумений не пытайтесь создавать обычные функции с такими же именами и типами входных данных, что и у агрегатных функций. При возникновении конфликта агрегатные функции обладают более высоким приоритетом.
Агрегатная функция состоит из одной или двух обычных функций: обязательной переходной функции (функция) и необязательной завершающей функции (завершающая _функция).
PostgreSQL использует временную переменную типа переходный_тип, которая обновляется переходной функцией для каждой входной записи. Если в команде CREATE AGGREGATE определена завершающая функция, то после обработки всех данных она будет вызвана для вычисления окончательного результата. В противном случае возвращается итоговое значение переходной переменной без дополнительной обработки.
Команда CREATE AGGREGATE также может задать исходное состояние внутренней переходной переменной; для этой цели используется ключевое слово INITCOND. PostgreSQL хранит это значение в базе данных в виде типа text, однако оно должно представлять константу переходного типа, заданного с ключевым словом STYPE. Если параметр не задан, он инициализируется псевдозначением NULL.
Если переходная функция была создана с атрибутом isstrict (см. описание команды CREATE FUNCTION), она не может вызываться с параметром NULL. Если переходная функция объявлена подобным образом, выполнение агрегатной функции отличается от обычного — все входные параметры NULL игнорируются, и функция для них не вызывается. При этом сохраняется предыдущее переходное значение, а агрегатная функция продолжает обработку входных данных.
Кроме того, если промежуточная переменная была инициализирована псевдозначением NULL, она заменяется первым входным значением, отличным от NULL, а переходная функция вызывается для второго входного значения, отличного от NULL. Эта особенность может пригодиться для создания агрегатных функций, аналогичных функции max(). Обратите внимание: это происходит только в том случае, если входпой_тип и переходный_гпип совпадают. Если типы различаются, вы должны либо передать начальное значение, отличное от NULL, либо использовать переходную функцию без атрибута isstrict.
Если переходная функция не объявлена с атрибутом isstrict, она вызывается для каждого входного значения без исключений. При этом у программиста появляется возможность самостоятельно организовать обработку псевдозначеннй NULL во входных данных.
Если завершающая функция объявлена с атрибутом isstrict, она не будет вызываться в том случае, если итоговое переходное состояние равно NULL; вместо этого автоматически выводится результат NULL.