AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 21266
Accepted
keponk
keponk
Asked: 2012-07-21 13:54:40 +0800 CST2012-07-21 13:54:40 +0800 CST 2012-07-21 13:54:40 +0800 CST

Entendendo o ALL_TAB_COLUMNS da Oracle

  • 772

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_COLUMNSpoderia 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 datatypee é lengthdiferente UIDPKe por que NULLABLEnão é o mesmo?

oracle metadata
  • 3 3 respostas
  • 29558 Views

3 respostas

  • Voted
  1. Best Answer
    a_horse_with_no_name
    2012-07-21T23:06:32+08:002012-07-21T23:06:32+08:00

    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 usar user_tab_columns). Você também pode incluir a OWNERcoluna em sua lista de seleção para verificar isso.

    Para VARCHAR(e outras colunas de caracteres) o tamanho é armazenado CHAR_LENGTHconforme documentado no manual. Observe que você também precisa verificar CHAR_USEDse 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_SCALEe DATA_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:

    SELECT dbms_metadata.get_ddl('TABLE', 'EMPLOYEE', 'SCOTT')
    FROM dual;
    
    • 6
  2. ConcernedOfTunbridgeWells
    2012-07-21T13:56:42+08:002012-07-21T13:56:42+08:00

    ALL_TAB_COLUMNSestá 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_COLUMNSmostraria 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.

    • 3
  3. miracle173
    2012-07-23T08:11:37+08:002012-07-23T08:11:37+08:00

    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 :

    ResultSet getColumns(Catálogo de strings,
                       String esquemaPadrão,
                       String tableNamePadrão,
                       String columnNamePattern)
                         lança SQLExceptionRecupera uma descrição das colunas da tabela disponíveis no catálogo especificado.
    Somente as descrições de coluna que correspondem aos critérios de catálogo, esquema, tabela e nome de coluna são retornadas. Eles são ordenados por TABLE_CAT,TABLE_SCHEM, TABLE_NAME e ORDINAL_POSITION.
    
    Cada descrição de coluna tem as seguintes colunas:
    
    1.TABLE_CAT String => catálogo de tabelas (pode ser nulo)
    2.TABLE_SCHEM String => esquema de tabela (pode ser nulo)
    3.TABLE_NAME String => nome da tabela
    4.COLUMN_NAME String => nome da coluna
    5.DATA_TYPE int => Tipo SQL de java.sql.Types
    6.TYPE_NAME String => Nome do tipo dependente da fonte de dados, para um UDT o nome do tipo é totalmente qualificado
    7.COLUMN_SIZE int => tamanho da coluna.
    8.BUFFER_LENGTH não é usado.
    9.DECIMAL_DIGITS int => o número de dígitos fracionários. Nulo é retornado para tipos de dados em que DECIMAL_DIGITS não é aplicável.
    10.NUM_PREC_RADIX int => Radix (normalmente 10 ou 2)
    11.NULLABLE int => é NULL permitido.
    •columnNoNulls - pode não permitir valores NULL
    •columnNullable - definitivamente permite valores NULL
    •columnNullableUnknown - nulidade desconhecida
    12.OBSERVAÇÕES String => comentário que descreve a coluna (pode ser nulo)
    13.COLUMN_DEF String => valor padrão para a coluna, que deve ser interpretado como uma string quando o valor estiver entre aspas simples (pode ser nulo)
    14.SQL_DATA_TYPE int => não utilizado
    15.SQL_DATETIME_SUB int => não utilizado
    16.CHAR_OCTET_LENGTH int => para tipos de caracteres o número máximo de bytes na coluna
    17.ORDINAL_POSITION int => índice da coluna na tabela (começando em 1)
    18.IS_NULLABLE String => As regras ISO são usadas para determinar a nulidade de uma coluna.
    •SIM --- se a coluna puder incluir NULLs
    • NÃO --- se a coluna não puder incluir NULLs
    • string vazia --- se a nulidade da coluna for desconhecida
    19.SCOPE_CATALOG String => catálogo da tabela que é o escopo de um atributo de referência (null se DATA_TYPE não for REF)
    20.SCOPE_SCHEMA String => esquema da tabela que é o escopo de um atributo de referência (null se o DATA_TYPE não for REF)
    21.SCOPE_TABLE String => nome da tabela que é o escopo de um atributo de referência (nulo se o DATA_TYPE não for REF)
    22.SOURCE_DATA_TYPE short => tipo de origem de um tipo distinto ou tipo Ref gerado pelo usuário, tipo SQL de java.sql.Types (null se DATA_TYPE não for DISTINCT ou REF gerado pelo usuário)
    23.IS_AUTOINCREMENT String => Indica se esta coluna é incrementada automaticamente
    •SIM --- se a coluna for incrementada automaticamente
    • NÃO --- se a coluna não for incrementada automaticamente
    • string vazia --- se não for possível determinar se a coluna é incrementada automaticamente
    24.IS_GENERATEDCOLUMN String => Indica se esta é uma coluna gerada
    •SIM --- se for uma coluna gerada
    • NÃO --- se não for uma coluna gerada
    • string vazia --- se não for possível determinar se esta é uma coluna gerada
    A coluna COLUMN_SIZE especifica o tamanho da coluna para determinada coluna. Para dados numéricos, esta é a precisão máxima. Para dados de caracteres, este é o comprimento em caracteres. Para tipos de dados datetime, esse é o comprimento em caracteres da representação String (assumindo a precisão máxima permitida do componente de segundos fracionários). Para dados binários, este é o comprimento em bytes. Para o tipo de dados ROWID, este é o comprimento em bytes. Nulo é retornado para tipos de dados em que o tamanho da coluna não é aplicável.
    
    Parâmetros:
    catálogo - um nome de catálogo; deve corresponder ao nome do catálogo conforme armazenado no banco de dados; "" recupera aqueles sem catálogo; null significa que o nome do catálogo não deve ser usado para restringir a pesquisa
    schemaPattern - um padrão de nome de esquema; deve corresponder ao nome do esquema conforme armazenado no banco de dados; "" recupera aqueles sem esquema; null significa que o nome do esquema não deve ser usado para restringir a pesquisa
    tableNamePattern - um padrão de nome de tabela; deve corresponder ao nome da tabela conforme ela é armazenada no banco de dados
    columnNamePattern - um padrão de nome de coluna; deve corresponder ao nome da coluna conforme armazenado no banco de dados
    Devoluções:
    ResultSet - cada linha é uma descrição de coluna
    Lança:
    SQLException - se ocorrer um erro de acesso ao banco de dados
    Veja também:
    getSearchStringEscape()
    
    • 1

relate perguntas

  • Backups de banco de dados no Oracle - Exportar o banco de dados ou usar outras ferramentas?

  • ORDER BY usando prioridades personalizadas para colunas de texto

  • Interface sqlplus confortável? [fechado]

  • Como encontrar as instruções SQL mais recentes no banco de dados?

  • Como posso consultar nomes usando expressões regulares?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve