CREATE AGGREGATE nome ( 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 ] [ , SORTOP = operador_de_classificação ] ) ou a sintaxe antiga CREATE AGGREGATE nome ( BASETYPE = tipo_base, SFUNC = função_de_transição_de_estado, STYPE = tipo_de_dado_do_estado [ , FINALFUNC = função_final ] [ , INITCOND = condição_inicial ] [ , SORTOP = operador_de_classificação ] )
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 ainda não fornecida, então pode ser utilizado o comando CREATE AGGREGATE para fornecer as funcionalidades desejadas. [1]
Se for fornecido o nome do esquema (por exemplo, CREATE AGGREGATE meu_esquema.minha_agregacao ...) então a função de agregação será criada no esquema especificado, senão será criada no esquema corrente.
Uma função de agregação é identificada pelo seu nome e tipos 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 tipos de dado de entrada de uma função de agregação também devem ser diferentes do nome e tipos 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_valor_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 linha da entrada é calculado o valor do argumento da agregação, e a função de transição de estado é chamada com o valor do estado corrente e o novo valor do argumento para calcular o novo valor do estado interno. Após toda as linhas terem sido processadas, é chamada uma vez a função final para calcular o valor retornado pela agregação. Não havendo nenhuma função final, então o valor do estado final é retornado como se encontra.
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 entradas nulas. Neste tipo de função de transição, a execução da agregação se comporta da seguinte maneira: são ignoradas as linhas com qualquer valor de entrada nulo (a função não é chamada, e o valor do estado anterior permanece); Se o valor do estado inicial for nulo, então na primeira linha com todos os valores de entrada diferentes de nulo o valor do primeiro argumento substitui o valor do estado, e a função de transição passa a ser chamada nas linhas seguintes contendo todos os valores de entrada diferentes de 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 primeiro tipo_de_dado_da_entrada. Quando estes tipos de dado forem diferentes, deverá ser fornecida uma condição inicial não nula, ou utilizada 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 linha 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 do 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, será retornado automaticamente um resultado nulo (É claro que este é apenas o comportamento normal de funções estritas). 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.
As agregações que se comportam como MIN ou MAX podem algumas vezes serem otimizadas procurando em um índice em vez de varrer todas as linhas de entrada. Se a agregação puder ser otimizada desta maneira, isto deve ser indicado especificando o operador de classificação. O requisito básico é que a agregação deve produzir o primeiro elemento da ordem de classificação induzida pelo operador; em outras palavras
SELECT agg(col) FROM tab;
deve ser equivalente a
SELECT col FROM tab ORDER BY col USING operador_de_classificação LIMIT 1;
Também é assumido que a agregação ignora entradas nulas, e que produz um resultado nulo se, e apenas se, não houverem entradas não nulas. Normalmente o operador < do tipo de dado é o operador de classificação apropriado para MIN, e > é o operador de classificação apropriado para MAX. Deve ser observado que a otimização nunca será concretizada a menos que o operador seja membro da estratégia "menor que" ou "maior que" da classe de operadores do índice da árvore-B.
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. Para criar uma função de agregação sem argumentos deve ser escrito * no lugar da lista de tipos de dado de entrada (Um exemplo deste tipo de agregação é count(*)).
Na sintaxe antiga para CREATE AGGREGATE o tipo de dado de entrada é especificado pelo parâmetro tipo_base, em vez de ser escrito após o nome da agregação. Deve ser observado que esta sintaxe permite apenas um parâmetro de entrada. Para definir uma função de agregação sem argumentos, o tipo_base deve ser especificado como "ANY" (e não *).
O nome da função de transição de estado a ser chamada para cada linha da entrada. Para uma função de agregação com N-argumentos, a função_de_transição_de_estado deve receber N+1 argumentos, sendo o primeiro do tipo tipo_de_dado_do_estado, e os demais correspondendo aos tipos de dado de entrada declarados da agregação. A função deve retornar um valor do tipo tipo_de_dado_do_estado. Esta função recebe o valor do estado corrente e os valores dos dados de entrada correntes, 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 todas as linhas de entrada terem sido percorridas. 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 não for especificada uma função_final, então é utilizado o valor do estado final como resultado da agregação, e o tipo de dado retornado pela agregação 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 especificada, o valor do estado começa com nulo.
O operador de classificação associado para agregações do tipo MIN e MAX. É apenas o nome de um operador (possivelmente qualificado pelo esquema). É assumido que o operador possua os mesmos tipos de dado de entrada que o da agregação (que deve ser uma agregação de um único argumento).
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.) |