Sou novo em Oracle e administração de banco de dados em geral.
Como contexto, quero criar uma classe Java que me forneça as informações que obteria usando DESC SOME_TABLE
.
Não consigo encontrar nenhuma maneira específica de fazer isso em Java, no entanto, descobri que ALL_TAB_COLUMNS
poderia me fornecer informações semelhantes. Eu tentei no SQL Developer para ver quão diferente era a saída. Acontece que os resultados são muito mais diferentes do que eu esperava.
Eu estava esperando que alguém pudesse me orientar sobre como interpretar o seguinte:
desc SOME_TABLE;
select
COLUMN_NAME
, DATA_TYPE
, DATA_LENGTH
, NULLABLE
from ALL_TAB_COLUMNS
where TABLE_NAME='SOME_TABLE'
order by column_id;
Dá a saída:
Name Null Type
--------------- ------- ----------------------
UIDPK NUMBER(20)
NAME VARCHAR2(255)
2 rows selected
COLUMN_NAME DATA_TYPE DATA_LENGTH NULLABLE
--------------- -------------- -------------- --------
UIDPK NUMBER 22 N
UIDPK NUMBER 22 N
UIDPK NUMBER 22 Y
NAME VARCHAR2 255 N
NAME VARCHAR2 255 Y
NAME VARCHAR2 255 N
6 rows selected
Por que cada coluna é repetida 3 vezes? Por que o datatype
e é length
diferente UIDPK
e por que NULLABLE
não é o mesmo?
Muito provavelmente existem três esquemas (usuários) que contêm essa tabela. Você precisa incluir
OWNER = 'FOOBAR'
em sua consulta all_tab_columns (ou usaruser_tab_columns
). Você também pode incluir aOWNER
coluna em sua lista de seleção para verificar isso.Para
VARCHAR
(e outras colunas de caracteres) o tamanho é armazenadoCHAR_LENGTH
conforme documentado no manual. Observe que você também precisa verificarCHAR_USED
se a definição está em bytes ou caracteres (VARCHAR(10 Bytes)
vs.VARCHAR(10 Char)
).Para colunas numéricas, a definição é armazenada em
DATA_SCALE
eDATA_PRECISION
.Tudo isso está descrito no manual: http://docs.oracle.com/cd/E11882_01/server.112/e25513/statviews_2103.htm#I1020277
Você está ciente de que pode recuperar a definição completa de uma tabela usando `DBMS_METADATA usando uma instrução SELECT:
ALL_TAB_COLUMNS
está mostrando todas as tabelas às quais você tem acesso, não apenas as que você possui. Eu diria que existem três esquemas no servidor com o banco de dados do aplicativo presente.USER_TAB_COLUMNS
mostraria apenas as tabelas que você possui (ou seja, apenas as do esquema pertencentes ao usuário com o qual você está conectado).Se você se conectar como um login de DBA, poderá ver outro conjunto de visualizações de dicionário de dados chamado
DBA_*
que possui todos os objetos na instância, independentemente da propriedade.Esta não é uma resposta à sua pergunta, mas um comentário à sua declaração de que você não encontrou a possibilidade de recuperar as informações sobre colunas de tabela em java diretamente. java fornece essas informações de maneira independente do banco de dados.
Javadoc: java.sql, Interface DatabaseMetaData, getColumns :