Documentação do PostgreSQL 8.0.0 | ||||
---|---|---|---|---|
Anterior | Início | Capítulo 31. Estendendo a linguagem SQL | Fim | Próxima |
Pode ser definida mais de uma função possuindo o mesmo nome SQL, desde que os argumentos recebidos sejam diferentes. Em outras palavras, os nomes das funções podem ser sobrecarregados. Quando um comando é executado, o servidor determina a função a ser chamada a partir dos tipos de dado e do número de argumentos fornecidos. A sobrecarga também pode ser utilizada para simular funções com número variável de argumentos, até um número máximo finito.
Ao ser criada uma família de funções sobrecarregadas, deve ser tomado cuidado para não criar ambigüidades. Por exemplo, dadas as funções
CREATE FUNCTION teste(int, real) RETURNS ... CREATE FUNCTION teste(smallint, double precision) RETURNS ...
não fica imediatamente claro qual das duas funções deve ser chamada por uma entrada trivial como teste(1, 1.5). As regras de resolução implementadas atualmente estão descritas no Capítulo 10, mas não é prudente projetar um sistema que dependa de sutilezas deste comportamento.
A função que recebe um único argumento de tipo composto geralmente não deve ter o nome de nenhum atributo (campo) deste tipo. Lembre-se que atributo(tabela) é considerado equivalente a tabela.atributo. No caso de haver ambigüidade entre a função de tipo composto e um atributo de tipo composto, sempre será utilizado o atributo. É possível mudar esta escolha qualificando o nome da função com o esquema (ou seja, esquema.func(tabela)), mas é melhor evitar este problema não escolhendo nomes conflitantes.
Ao sobrecarregar funções na linguagem C, existe uma restrição adicional: o nome C de cada uma das funções da família de funções sobrecarregadas deve ser diferente dos nomes C de todas as outras funções, sejam internas ou carregadas dinamicamente. Se esta regra for violada, o comportamento não é portável. Deve ser recebido um erro de ligação em tempo de execução, ou uma das funções será chamada (geralmente a interna). A forma alternativa da cláusula AS para o comando SQL CREATE FUNCTION desvincula o nome SQL da função do nome da função no código fonte C. Por exemplo,
CREATE FUNCTION teste(int) RETURNS int AS 'nome_do_arquivo', 'teste_1arg' LANGUAGE C; CREATE FUNCTION teste(int, int) RETURNS int AS 'nome_do_arquivo', 'teste_2arg' LANGUAGE C;
Os nomes das funções C neste exemplo refletem uma das várias convenções possíveis.