[firebase-br] TABELAS E CAMPOS

Sandro Souza escovadordebits em gmail.com
Sex Dez 5 18:07:52 -03 2008


Bom dia/tarde João.

Utilize a ZQuery para obter essas informações de esquema (mapa) do banco de
dados.

Os respectivos SELECTs são os seguintes:

1 - Obtendo a lista de tabelas criadas pelo usuário:

SELECT
  RDB$RELATION_NAME NOME_DA_TABELA
FROM
  RDB$RELATIONS
WHERE
  ((RDB$SYSTEM_FLAG IS NULL)OR
  (RDB$SYSTEM_FLAG <> 1))AND
  (RDB$VIEW_BLR IS NULL)
ORDER BY
  RDB$RELATION_NAME

RDB$SYSTEM_FLAG = 1 -> Tabela de sistema (RDB$RELATIONS, etc...)
RDB$SYSTEM_FLAG = 0 ou NULL -> Tabela criada pelo usuário (CLIENTES,
PRODUTOS, etc...)
RDB$VIEW_BLR = NULL -> É uma tabela e não uma visão.

2 - Obtendo a lista dos nomes dos campos de uma tabela:

SELECT
  RDB$FIELD_NAME NOME_DO_CAMPO
FROM
  RDB$RELATION_FIELDS
WHERE
  RDB$RELATION_NAME = 'NOME_DA_TABELA'
ORDER BY
  RDB$FIELD_POSITION

3 - Obtendo todas as informações sobre os campos de uma tabela:

SELECT
  A.RDB$FIELD_NAME NOME_DO_CAMPO,
  C.RDB$TYPE_NAME TIPO,
  B.RDB$FIELD_SUB_TYPE SUBTIPO,
  B.RDB$FIELD_LENGTH TAMANHO,
  B.RDB$SEGMENT_LENGTH SEGMENTO,
  B.RDB$FIELD_PRECISION PRECISAO,
  B.RDB$FIELD_SCALE CASAS_DECIMAIS,
  A.RDB$DEFAULT_SOURCE VALOR_PADRAO,
  A.RDB$NULL_FLAG OBRIGATORIO
FROM
  RDB$RELATION_FIELDS A,
  RDB$FIELDS B,
  RDB$TYPES C
WHERE
  (A.RDB$RELATION_NAME = 'NOME_DA_TABELA')AND
  (B.RDB$FIELD_NAME = A.RDB$FIELD_SOURCE)AND
  (C.RDB$TYPE = B.RDB$FIELD_TYPE)AND
  (C.RDB$FIELD_NAME = 'RDB$FIELD_TYPE')

Agora vamos entender o significado dos campos retornados:

3.1 - NOME_DO_CAMPO

Informa o nome do campo, como o próprio nome sugere.

3.2 - TIPO

Nome do tipo interno do campo, ou seja, o formato utilizado internamente.
Entre outros valores, esses são os mais comuns:

3.2.1 - SHORT (O valor é armazenado como um inteiro de 16 bits com sinal).
3.2.2 - LONG (O valor é armazenado como um inteiro de 32 bits com sinal).
3.2.3 - INT64 (O valor é armazenado como um inteiro de 64 bits com sinal).
3.2.4 - FLOAT (O valor é armazenado como uma aproximação (ponto flutuante)
em 32 bits, tipo FLOAT normal).
3.2.5 - DOUBLE (O valor é armazenado como uma aproximação (ponto flutuante)
em 64 bits, tipo DOUBLE PRECISION normal).
3.2.6 - TEXT (O valor é uma sequência de caracteres com tamanho fixo, ou
seja, é o tipo CHAR).
3.2.7 - VARYING (O valor é uma sequência de caracteres com tamanho variável,
ou seja, é o tipo VARCHAR).
3.2.8 - BLOB (O valor é uma sequência de bytes/caracteres com tamanho
variável, ou seja, é o tipo BLOB).
3.2.9 - DATE (O valor é uma data, ou seja, é o tipo DATE).
3.2.10 -TIME (O valor é uma hora:minuto:segundo, ou seja, é o tipo TIME).
3.2.11 - TIMESTAMP (O valor é uma data/hora, ou seja, é o tipo TIMESTAMP).

3.3 - SUBTIPO

É o subtipo do tipo do campo, ou seja, combinando o tipo e o subtipo, temos
o tipo que foi declarado na criação do campo.
Veja as seguintes combinações:

Tipo SHORT com subtipo 0 é SMALLINT.
Tipo SHORT com subtipo 1 é NUMERIC.
Tipo SHORT com subtipo 2 é DECIMAL.

Tipo LONG com subtipo 0 é INTEGER.
Tipo LONG com subtipo 1 é NUMERIC.
Tipo LONG com subtipo 2 é DECIMAL.

Tipo INT64 com subtipo 0 é BIGINT.
Tipo INT64 com subtipo 1 é NUMERIC.
Tipo INT64 com subtipo 2 é DECIMAL.

Tipo BLOB com subtipo 1 é um BLOB que armazena texto (campos do tipo
"memo").
Tipo BLOB com qualquer outro subtipo é um BLOB que armazena dados binários
qualquer (imagens, arquivos, etc...).

3.4 - TAMANHO

É o tamanho, em bytes, que cada valor ocupa dentro do banco de dados.
Para o tipo CHAR, significa o tamanho fixo do texto.
Para o tipo VARCHAR, significa o tamanho máximo do texto.

3.5 - SEGMENTO

Significa o tamanho de segmento do campo do tipo BLOB, ou seja, é NULL para
os outros tipos.

3.6 - PRECISAO

É a quantidade total de dígitos, incluindo as casas decimais.
Em campos não numéricos, é NULL.

3.7 - CASAS_DECIMAIS

É a quantidade de casas decimais (CASAS_DECIMAIS <= PRECISAO).
Em campos não numéricos, é zero.

3.8 - VALOR_PADRAO

É o valor padrão a ser atribuido a esse campo caso nenhum valor seja
informado para ele (cláusula DEFAULT).

3.9 - OBRIGATORIO

Indica se esse campo é obrigatório (1) ou não (NULL).

Outras informações podem ser estraidas do banco de dados, que é o que o IB
Expert, entre outras ferramentas, fazem para gerar os scripts de criação das
estruturas do banco, por exemplo.

Espero ter ajudado mais que atrapalhado. :D

2008/12/5 joao_jma <joao_jma em itelefonica.com.br>

> como extrair nomes das tabelas e dos campos de um banco firebird usando o
> ZEOS ???
>
>
> abraço
>
>    João M. de Amorim - Informática:
>    Andreza Enxovais - Ibitinga/SP
>    ((16) 3341-9000
>    È(16) 9239-0959
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>



Mais detalhes sobre a lista de discussão lista