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 ] )
O comando CREATE AGGREGATE cria uma função de agregação. Algumas funções de agregação básicas e comumente utilizadas estão incluídas na distribuição; estão documentadas na Seção 9.15. Se forem criados tipos novos, ou se for necessária uma função de agregação não fornecida, então o comando CREATE AGGREGATE pode ser utilizado para fornecer as funcionalidades desejadas. [1] [2]
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 da função_de_transição_de_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 [3] ). 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.
O nome (opcionalmente qualificado pelo esquema) da função de agregação a ser criada.
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(*)).
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.
O tipo de dado do valor do estado da agregação.
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.
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.
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.
[1] |
Oracle — As funções de agregação definidas pelo usuário (UDAGs) se referem a funções de agregação com semântica de agregação especificada pelo usuário. Os usuários podem criar novas funções de agregação e fornecer a lógica da agregação através de um conjunto de rotinas. Após criada, a função de agregação definida pelo usuário poderá ser utilizada em comandos da DML do SQL de maneira semelhante às agregações nativas. O servidor de banco de dados Oracle avalia a UDAG chamando as rotinas de agregação fornecidas pelo usuário de forma apropriada. Os bancos de dados estão cada vez mais sendo utilizados para armazenar dados complexos como imagem, espacial, áudio, vídeo, etc. Os dados complexos são tipicamente armazenados no banco de dados utilizando tipos objeto, tipos opaco (opaque), ou LOBs. As agregações definidas pelo usuário são úteis, principalmente, para especificar agregações para estes novos domínios de dados. Além disso, as UDAGs podem ser utilizadas para criar novas funções de agregação para tipos de dado escalares tradicionais para aplicativos financeiros ou científicos. Como não é possível fornecer suporte nativo para todas as formas de agregação, é desejável prover os desenvolvedores de aplicativos de mecanismos flexíveis para adicionar novas funções de agregação. Oracle® Database Concepts 10g Release 1 (10.1) Part Number B10743-01 (N. do T.) |
[2] |
SQL Server — O comando CREATE AGGREGATE cria uma função de agregação definida pelo usuário, cuja implementação é definida em uma classe de um assembly (coleção de um ou mais arquivos físicos que compõem o aplicativo) do Microsoft .NET Framework. Para o Mecanismo de Banco de Dados do SQL Server 2005 vincular a função de agregação à sua implementação, primeiro o assembly do .NET Framework que contém a implementação deve ser erguido para uma instância do SQL Server utilizando o comando CREATE ASSEMBLY. SQL Server 2005 Books Online — CREATE AGGREGATE (Transact-SQL) (N. do T.) |
[3] |
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.) |