CREATE AGGREGATE

Nome

CREATE AGGREGATE -- cria uma função de agregação

Sinopse

CREATE AGGREGATE nome (
    BASETYPE = tipo_de_dado_da_entrada,
    SFUNC = função_de_transição_de_estado,
    STYPE = tipo_de_dado_do_estado
    [ , FINALFUNC = função_final ]
    [ , INITCOND = condição_inicial ]
)

Descrição

O comando CREATE AGGREGATE cria uma função de agregação. Algumas funções de agregação para tipos base, como min(integer) e avg(double precision) são fornecidas na distribuição padrão. Se forem criados tipos novos, ou se houver necessidade de uma função de agregação não fornecida, então o comando CREATE AGGREGATE pode ser utilizado para fornecer as funcionalidades desejadas.

Se for fornecido o nome do esquema (por exemplo, CREATE AGGREGATE meu_esquema.minha_agregacao ...) então a função de agregação é criada no esquema especificado, senão é criada no esquema corrente.

Uma função de agregação é identificada pelo seu nome e tipo de dado de entrada. Duas funções de agregação no mesmo esquema podem ter o mesmo nome se operarem em tipos de dado de entrada diferentes. O nome e tipo de dado de entrada de uma função de agregação também deve ser diferente do nome e tipo(s) de dado de entrada de todas as funções comuns no mesmo esquema.

Uma função de agregação é composta por uma ou duas funções comuns: uma função de transição de estado, função_de_transição_de_estado, e uma função opcional para a realização dos cálculos finais, função_final. Estas funções são utilizadas da seguinte forma:

função_de_transição_de_estado( estado-interno, próximo-item-de-dado ) ---> próximo-estado-interno
função_final( estado-interno ) ---> valor-da-agregação

O PostgreSQL cria uma variável temporária com o tipo de dado tipo_de_dado_do_estado para armazenar o estado interno corrente da agregação. Para cada item de dado da entrada a função de transição de estado é chamada para calcular o novo valor do estado interno. Após todos os dados terem sido processados, a função final é chamada uma vez para calcular o valor retornado da agregação. Não havendo nenhuma função final, então o valor do estado final é retornado como estiver.

A função de agregação pode fornecer uma condição inicial, ou seja, um valor inicial para o valor do estado interno. Este valor é especificado e armazenado no banco de dados em uma coluna do tipo text, mas deve possuir uma representação externa válida para uma constante do tipo de dado do valor do estado. Se não for fornecido, então o valor do estado começa com nulo.

Se a função de transição de estado for declarada como "strict", então não poderá ser chamada com valores da entrada nulos. Para este tipo de função de transição, a execução da agregação se comporta da seguinte forma: Valores da entrada nulos são ignorados (a função não é chamada e o valor do estado anterior permanece); Se o valor do estado inicial for nulo, então o primeiro valor da entrada que não for nulo substitui o valor do estado, e a função de transição é chamada a partir do segundo valor da entrada que não for nulo. Este procedimento é útil para implementar funções de agregação como max. Deve ser observado que este comportamento somente está disponível quando o tipo_de_dado_do_estado for o mesmo do tipo_de_dado_da_entrada. Quando estes tipos de dado forem diferentes, deverá ser fornecido um valor não nulo para a condição inicial, ou utilizar uma função de transição que não seja estrita.

Se a função de transição de estado não for estrita então será chamada, incondicionalmente, para cada valor da entrada, devendo ser capaz de lidar com entradas nulas e valores de transição nulos por si própria. Esta opção permite ao autor da função de agregação ter pleno controle sobre o tratamento dos valores nulos.

Se a função final for declarada como "strict", então não será chamada quando o valor do estado final for nulo; em vez disso, um resultado nulo será retornado automaticamente (É claro que este é apenas o comportamento normal de funções estritas [1] ). A função final sempre tem a opção de retornar o valor nulo. Por exemplo, a função final para avg retorna nulo quando não há linhas de entrada.

Parâmetros

nome
O nome (opcionalmente qualificado pelo esquema) da função de agregação a ser criada.
tipo_de_dado_da_entrada
O tipo do dado de entrada sobre o qual esta função de agregação opera. Pode ser especificado como "ANY" para uma função de agregação que não examina seus valores de entrada (um exemplo é a função count(*)).
função_de_transição_de_estado
O nome da função de transição de estado a ser chamada para cada valor dos dados da entrada. Normalmente esta função possui dois argumentos, o primeiro sendo do tipo tipo_de_dado_do_estado e o segundo do tipo tipo_de_dado_da_entrada. Outra possibilidade, para funções de agregação que não examinam seus valores de entrada, é a função possuir apenas um argumento do tipo tipo_de_dado_do_estado. Em qualquer um dos casos a função deve retornar um valor do tipo tipo_de_dado_do_estado. Esta função recebe o valor do estado corrente e o item de dado da entrada corrente e retorna o próximo valor do estado.
tipo_de_dado_do_estado
O tipo de dado do valor do estado da agregação.
função_final
O nome da função final chamada para calcular o resultado da agregação após todos os dados da entrada terem sido examinados. A função deve receber um único argumento do tipo tipo_de_dado_do_estado. O tipo de dado retornado pela agregação é definido pelo tipo retornado por esta função. Se a função_final não for especificada, então o valor do estado final é utilizado como sendo o resultado da agregação, e o tipo retornado fica sendo o tipo_de_dado_do_estado.
condição_inicial
A definição inicial do valor do estado. Deve ser uma constante cadeia de caracteres na forma aceita pelo tipo de dado tipo_de_dado_do_estado. Se não for especificado, o valor do estado começa com nulo.

Os parâmetros para CREATE AGGREGATE podem ser escritos em qualquer ordem, e não apenas na ordem mostrada acima.

Exemplos

Veja a Seção 33.9 .

Compatibilidade

O comando CREATE AGGREGATE é uma extensão do PostgreSQL à linguagem. O padrão SQL não inclui funções de agregação definidas pelo usuário.

Veja também

ALTER AGGREGATE , DROP AGGREGATE

Notas

[1]

strict — A função f é estrita em um argumento se "f bottom = bottom". Em outras palavras, o resultado depende do argumento e, portanto, a avaliação da aplicação da função não pode terminar enquanto a avaliação do argumento não tenha terminado. FOLDOC - Free On-Line Dictionary of Computing (N. do T.)

SourceForge.net Logo