CREATE TYPE

Name

CREATE TYPE  --  define um novo tipo de dado

Synopsis

CREATE TYPE nome_do_tipo ( INPUT = função_de_entrada, OUTPUT = função_de_saída
      , INTERNALLENGTH = { comprimento_interno | VARIABLE }
    [ , EXTERNALLENGTH = { comprimento_externo | VARIABLE } ]
    [ , DEFAULT = padrão ]
    [ , ELEMENT = elemento ] [ , DELIMITER = delimitador ]
    [ , SEND = função_de_envio ] [ , RECEIVE = função_de_recepção ]
    [ , PASSEDBYVALUE ]
    [ , ALIGNMENT = alinhamento ]
    [ , STORAGE = armazenamento ]
)
  

Entradas

nome_do_tipo

O nome do tipo a ser criado.

comprimento_interno

Um valor literal, especificando o comprimento interno do novo tipo.

comprimento_externo

Um valor literal, especificando o comprimento externo (exibido) do novo tipo.

função_de_entrada

O nome da função criada pelo comando CREATE FUNCTION que converte os dados da forma externa para a forma interna do tipo.

função_de_saída

O nome da função criada pelo comando CREATE FUNCTION que converte os dados da forma interna numa forma adequada para ser exibida.

elemento

O tipo sendo criado é um array; especifica o tipo dos elementos do array.

delimitador

O caractere delimitador a ser usado entre os valores, nos arrays feitos deste tipo.

padrão

O valor padrão para o tipo de dado. Usualmente omitido, fazendo com que NULL seja o padrão.

função_de_envio

O nome da função, criada pelo comando CREATE FUNCTION, que converte os dados deste tipo em uma forma adequada para transmitir para outra máquina.

função_de_recepção

O nome da função, criada pelo comando CREATE FUNCTION, que converte os dados deste tipo da forma de transmissão para a forma interna.

alinhamento

Alinhamento de armazenamento requerido por este tipo de dado. Se for especificado, deve ser char, int2, int4 ou double; o padrão é int4.

armazenamento

Técnica de armazenamento para este tipo de dado. Se for especificado, deve ser plain, external, extended ou main; o padrão é plain.

Saídas

CREATE

Mensagem retornada se o tipo for criado com sucesso.

Descrição

O comando CREATE TYPE permite ao usuário registrar um novo tipo de dado do usuário no PostgreSQL, para ser usado no banco de dados corrente. O usuário que define o tipo se torna o seu dono. O nome_do_tipo é o nome do novo tipo, devendo ser único entre os tipos definidos para este banco de dados.

O comando CREATE TYPE requer o registro de duas funções (usando CREATE FUNCTION) antes de definir o tipo. A representação do novo tipo base é determinada pela função_de_entrada, que converte a representação externa do tipo na representação interna utilizável pelos operadores e funções definidas para o tipo. Naturalmente a função_de_saída realiza a transformação inversa. A função de entrada pode ser declarada como recebendo um argumento do tipo opaque, ou como recebendo três argumentos dos tipos opaque, OID e int4 (O primeiro argumento é o texto de entrada como uma cadeia de caracteres C, o segundo argumento é o tipo do elemento no caso de ser um tipo array, e o terceiro é o typmod da coluna de destino, se for conhecido). A função de saída pode ser declarada como recebendo um argumento do tipo opaque, ou como recebendo dois argumentos dos tipos opaque e OID (O primeiro argumento é na verdade do próprio tipo do dado, mas como a função de saída deve ser declarada primeiro, é mais fácil declará-la como recebendo o tipo opaque. O segundo argumento é novamente o tipo do elemento do array para tipos array).

Novos tipos de dado base podem ser de comprimento fixo e neste caso o comprimento_interno é um inteiro positivo, ou podem ser de comprimento variável indicado por fazer comprimento_interno igual a VARIABLE (Internamente é representado definindo typlen como -1). A representação interna de todos os tipos de comprimento variável devem começar por um número inteiro indicando o comprimento total deste valor do tipo.

A comprimento da representação externa é analogamente especificado usando a palavra chave comprimento_externo (Este valor não é utilizado atualmente, sendo tipicamente omitido, assumindo o valor padrão que é VARIABLE).

Para indicar que o tipo é um array, especifica-se o tipo dos elementos do array usando a palavra chave ELEMENT. Por exemplo, para definir um array de inteiros de 4 bytes ("int4"), especifica-se

ELEMENT = int4

Mais detalhes sobre os tipos array são mostrados abaixo.

Para indicar o delimitador a ser usado entre os valores na representação externa dos arrays deste tipo, o delimitador pode ser especificado como um caractere específico. O delimitador padrão é a vírgula, (','). Observe que o delimitador está associado com o tipo de elemento do array, e não com o próprio array.

Um valor padrão pode ser especificado, quando o usuário desejar que as colunas com este tipo de dado tenham um valor padrão diferente de NULL. Especifica-se o padrão com a palavra chave DEFAULT (Este tipo de padrão pode ser substituído por um cláusula DEFAULT explícita declarada na coluna).

Os argumentos opcionais função_de_envio e função_de_recepção não são usados atualmente, sendo usualmente omitidos (fazendo com que assumam o valor padrão que são função_de_saída e função_de_entrada respectivamente). Estas funções poderão ser ressuscitadas algum dia para especificar representações binárias independentes de máquinas.

O sinalizador opcional PASSEDBYVALUE indica que os valores deste tipo de dado são passados por valor, e não por referência. Observe que não se pode passar por valor os tipos cuja representação interna é maior do que o comprimento do tipo Datum (quatro bytes na maioria das máquinas, oito bytes em algumas).

A palavra chave alinhamento especifica o alinhamento do armazenamento requerido por este tipo de dado. Os valores permitidos igualam-se ao alinhamento das fronteiras de 1, 2, 4 ou 8 bytes. Observe que os tipos de tamanho variável devem ter um alinhamento de pelo menos 4, porque contêm necessariamente um int4 como seu primeiro componente.

A palavra chave armazenamento permite selecionar estratégias de armazenamento para tipos de dado de comprimento variável (somente plain é permitido para os tipos de comprimento fixo). O plain desativa TOAST para o tipo de dado: será sempre armazenado em linha e não comprimido. O extended permite toda a capacidade do TOAST: o sistema primeiro tenta comprimir um valor longo do dado, movendo o valor para fora da tabela principal se ainda continuar muito longo. O external permite que o valor seja movido para fora da tabela principal, mas o sistema não vai tentar comprimi-lo. O main permite a compressão, mas desencoraja mover o valor para fora da tabela principal (Os itens de dado com este método de armazenamento ainda podem ser movidos para fora da tabela principal se não houver outro meio para fazer o ajuste da linha, mas será mantido na tabela principal com preferência maior que os itens extended e external).

Tipos Array

Sempre que um tipo de dado definido pelo usuário é criado, o PostgreSQL automaticamente cria um tipo array associado, cujo nome consiste do nome do tipo base prefixado por um caractere sublinhado. O analisador compreende esta convenção de nome e traduz as requisições para colunas do tipo foo[] em requisições do tipo _foo. O tipo array criado implicitamente é de comprimento variável e usa as funções de entrada e saída nativas array_in e array_out.

Pode-se perguntar com razão "porque existe a opção ELEMENT, se o sistema produz o tipo array correto automaticamente?" O único caso em que é útil utilizar ELEMENT é quando se constrói um tipo de comprimento fixo que é internamente um array de N componentes idênticos, e deseja-se que estes N componentes sejam acessados diretamente por índices em adição a qualquer outra operação que se planeje fornecer para este tipo como um todo. Por exemplo, o tipo name permite que seus chars constituintes sejam acessados desta forma. Um tipo point 2-D pode permitir que seus dois componentes sejam acessados como point[0] e point[1]. Observe que esta facilidade somente funciona para tipos de comprimento fixo cuja forma interna seja exatamente uma seqüência de N campos de tamanho fixo idênticos. Um tipo de comprimento variável, para permitir índices deve possuir a representação interna generalizada usada por array_in e array_out. Por razões históricas (ou seja, claramente errado mas muito tarde para mudar) os índices de arrays de comprimento fixo começam por zero, enquanto índices de arrays de comprimento variável começam por um.

Notas

Os nomes dos tipos definidos pelo usuário não podem começar pelo caractere sublinhado ("_") e podem ter o comprimento de apenas 30 caracteres (ou, de uma maneira geral, NAMEDATALEN-2 em vez dos NAMEDATALEN-1 caracteres permitidos para os outros nomes). Os nomes de tipo começados por sublinhado são reservados para os nomes dos tipos array criados internamente.

Exemplos

Este exemplo cria o tipo de dado caixa e, em seguida, usa o tipo na definição de uma tabela:

CREATE TYPE caixa (INTERNALLENGTH = 16,
    INPUT = meu_procedimento_1, OUTPUT = meu_procedimento_2);
CREATE TABLE tbl_caixa (id INT4, descricao caixa);

Se a estrutura interna de caixa fosse um array contendo quatro float4, poderíamos escrever

CREATE TYPE caixa (INTERNALLENGTH = 16,
    INPUT = meu_procedimento_1, OUTPUT = meu_procedimento_2,
    ELEMENT = float4);

o que permitiria o valor de um componente da caixa ser acessado através do índice. Fora isso o tipo se comporta da mesma maneira que o anterior.

Este exemplo cria um tipo de objeto grande e o utiliza na definição de uma tabela:

CREATE TYPE objeto_grande (INPUT = lo_filein, OUTPUT = lo_fileout,
    INTERNALLENGTH = VARIABLE);
CREATE TABLE tbl_grandes_objetos (id int4, obj objeto_grande);

Compatibilidade

Este comando CREATE TYPE é uma extensão do PostgreSQL. Existe um comando CREATE TYPE no SQL99 que é bastante diferente nos detalhes.

Consulte também

CREATE FUNCTION, DROP TYPE , Guia do Programador do PostgreSQL