Documentação do PostgreSQL 8.0.0 | ||||
---|---|---|---|---|
Anterior | Início | Capítulo 31. Estendendo a linguagem SQL | Fim | Próxima |
Os tipos de dado do PostgreSQL são divididos em tipos base, tipos compostos, domínios e pseudotipos.
Os tipos base, como o int4, são aqueles implementados abaixo do nível da linguagem SQL (tipicamente em uma linguagem de baixo nível, como a linguagem C). Correspondem, geralmente, ao que normalmente é conhecido como tipo de dado abstrato (ADT). [1] [2] O PostgreSQL somente opera sobre estes tipos de dado através das funções fornecidas pelo usuário, e somente compreende o comportamento destes tipos de dado no grau em que são descritos pelo usuário. Por sua vez, os tipos de dado base são subdivididos em escalar e matriz. Para cada tipo escalar é criado, automaticamente, um tipo matriz correspondente podendo conter matrizes de tamanho variável deste tipo escalar.
Os tipos compostos, ou tipos linha, são criados toda vez que o usuário cria uma tabela; também é possível definir um tipo composto "autônomo", sem nenhuma tabela associada. Um tipo composto é simplesmente uma lista de tipos base com nomes de campo associados. O valor de um tipo composto é uma linha ou registro de valores de campo. O usuário pode acessar os campos componentes a partir de consultas SQL.
Um domínio se baseia em um determinado tipo base e, para muitas finalidades, é intercambiável com o seu tipo base. Entretanto, o domínio pode ter restrições limitando os valores válidos a um subconjunto dos valores permitidos pelo tipo base subjacente.
Os domínios podem ser criados utilizando o comando CREATE DOMAIN do SQL. A criação e uso de domínios não são vistos neste capítulo.
Existem alguns poucos "pseudotipos" para finalidades especiais. Os pseudotipos não podem aparecer como colunas de tabela ou atributos de tipo composto, mas podem ser usados para declarar tipos de dado de argumentos e resultados de funções. Fornecem um mecanismo dentro do sistema de tipos para identificar classes especiais de funções. A Tabela 8-20 lista os pseudotipos existentes.
Dois pseudotipos de especial interesse são anyelement e anyarray, chamados coletivamente de tipos polimórficos. Qualquer função declarada utilizando um destes tipos é dita como sendo uma função polimórfica. Uma função polimórfica pode operar sobre muitos tipos de dado diferentes, sendo o tipo de dado específico determinado pelo tipo de dado passado para a função na hora da chamada.
Os argumentos e resultados polimórficos estão presos um ao outro, sendo determinados como um tipo de dado específico quando o comando que faz a chamada à função polimórfica é analisado. Todas as posições (tanto argumento como valor retornado) declaradas como anyelement podem receber qualquer tipo de dado, mas em uma determinada chamada todas devem ter o mesmo tipo. Todas as posições declaradas como anyarray podem ter qualquer tipo de dado matriz, mas de forma análoga todas as posições devem ser do mesmo tipo. Havendo algumas posições declaradas como anyarray e outras declaradas como anyelement, o tipo matriz nas posições anyarray devem ser matrizes cujos elementos são do mesmo tipo aparecendo nas posições anyelement.
Portanto, quando são declarados argumentos de tipo polimórfico em mais de uma posição, resulta em que apenas certas combinações de tipos de argumento são permitidas. Por exemplo, uma função declarada como igual(anyelement, anyelement) recebe quaisquer dois valores de entrada, desde que ambos sejam do mesmo tipo de dado.
Quando o valor retornado por uma função é declarado como sendo do tipo polimórfico, deve haver pelo menos uma posição de argumento que também seja polimórfica, e o tipo de dado fornecido como argumento determina o tipo de dado real do resultado para a chamada. Por exemplo, se já não houvesse um mecanismo de índice para matriz, este poderia ser implementado por uma função como indice(anyarray, integer) returns anyelement. Esta declaração restringe o primeiro argumento como sendo do tipo matriz, permitindo ao analisador inferir o tipo de dado correto do resultado a partir do tipo de dado do primeiro argumento.
[1] |
abstract data type (ADT) — Um tipo de abstração de dado onde a forma interna do tipo fica escondida atrás de um conjunto de funções de acesso. Os valores do tipo são criados e inspecionados apenas pelas chamadas às funções de acesso, permitindo que a implementação do tipo seja modificada sem ser necessária qualquer modificação fora do módulo onde está definida. Os objetos e as ADTs são formas de abstração de dados, mas os objetos não são ADTs. Os objetos utilizam abstração procedural (métodos), e não abstração de tipo. Um exemplo clássico de ADT é o tipo de dado pilha, para o qual devem ser fornecidas funções para criar uma pilha vazia, para colocar elementos na pilha e para tirar elementos da pilha. FOLDOC - Free On-Line Dictionary of Computing (N. do T.) |
[2] |
abstract data type (ADT) — Um conjunto de valores de dados e operações associadas, precisamente especificados e independentes de qualquer implementação em particular. Dictionary of Algorithms and Data Structures (N. do T.) |