Pergunta

Eu estou usando driver thin JDBC da Oracle (10.2.0.3) para conexão com banco de dados de um Oracle 10g. Eu gostaria de obter informações sobre as colunas de banco de dados, então eu uso ResultSetMetaData . O importante necessidade mais informações é o tipo da coluna e o comprimento, então eu uso GetColumnType , getPrecision , e métodos getScale .

Ele trabalha para uma consulta simples (select * from tablename) se o tipo de coluna é "simples" como VARCHAR2(50), NUMBER(5), NUMBER(6,2). Se eu tiver uma consulta mais complexa (select count(*) from tablename) ou uma consulta com base em uma visão que contém alguns cálculos complexos, os métodos dão resultados estranhos como:

  • getScale: -127
  • tanto getPrecision e getScale é 0
  • getPrecision: -1

Como definir a propriedade de conexão oracle.jdbc.J2EE13Compliant para true (como sugerido por várias páginas) elimina getScale = -127, mas ainda retorna 0/0 resultado.

O mais provável é que eu tenho que criar uma solução alternativa para esses resultados estranhos, mas primeiro é necessário que pelo menos uma documentação completa sobre o comportamento de ResultSetMetaData da Oracle. Por exemplo, uma enorme mesa com o significado de getPrecision / getScale para todos os tipos SQL seria ótimo. Existe uma documentação como esta em algum lugar?

Foi útil?

Solução

A Oracle não pode retornar um tipo com base em uma visão ou o count(*) vez que não foi declarado explicitamente. Sua visão poderia retornar qualquer precisão ou escala, dependendo das tabelas underlaying da visão.

Para superar isso, você precisaria para lançar o tipo em sua consulta ou exibição como esta:

select CAST (count(*) AS NUMBER(30))

Outras dicas

Uma alternativa é user_tab_columns consulta ou all_tab_columns.

numa escala de 0 é aceitável: Um número (5) é o mesmo que um número (5,0)

A precisão no entanto tem de ser um número inteiro entre 1 e 38, quando ele está definido. Quando se é indefinido, como em número, o motorista tem que retornar algo, uma vez que não pode retornar nulo. Nesse caso, as escolhe driver para retornar 0.

Parece-me que não há documentação abrangente sobre ResultSetMetaData. Guia do Oracle® banco de dados JDBC desenvolvedor e Referência 10g Release 2 ( 10.2) e 11g Release 2 (11,2 ) dá exemplo sobre nome da coluna e tipo aqui , eles não lidar com outros aspectos.

um problema semelhante com PostgreSQL anos atrás e ele fez um patch. Talvez Oracle usa a mesma base de código aqui.

Você pode tentar usar o ojdbc14 _g .jar em vez de ojdbc14.jar como suas classes foram compiladas com "javac -g" e conter algumas informações de rastreamento.

Você também pode tentar drivers mais novos .

Você pode usar o rs.getBigDecimal(columnIndex) e do grande decimal você pode obter os valores de precisão / escala das colunas específicas.

Não uma resposta directa à sua pergunta, mas uma solução alternativa que você mencionou:

Se tudo que você tem a fazer é verificar ou comparar esquemas db, então em vez de ResultSetMetaData e consulta de todas as tabelas usar informações de esquema Oracle como descrito em Engenharia reversa um Data Model. Usei-o em minha utilitário para exportar tais informações ao texto

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top