Pregunta

Estoy usando el controlador delgado JDBC de Oracle (10.2.0.3) para conectarme a una base de datos Oracle 10g. Me gustaría obtener información sobre las columnas de la base de datos, así que uso ResultSetMetaData . La información más importante que necesito es el tipo de columna y la longitud, así que uso getColumnType , getPrecision , y getScale métodos.

Funciona para una consulta simple ( select * from tablename ) si el tipo de columna es " simple " como VARCHAR2 (50), NUMBER (5), NUMBER (6,2) . Si tengo una consulta más compleja ( seleccione el recuento (*) del nombre de tabla ) o una consulta basada en una vista que contiene algún cálculo complejo, los métodos dan resultados extraños como:

  • getScale : -127
  • tanto getPrecision como getScale es 0
  • getPrecision : -1

La configuración de la propiedad de conexión oracle.jdbc.J2EE13Compliant en true (como lo sugieren varias páginas web) elimina getScale = -127 pero aún devuelve el resultado 0/0.

Lo más probable es que tenga que crear una solución para estos resultados extraños, pero primero necesito al menos una documentación completa sobre el comportamiento de ResultSetMetaData de Oracle. Por ejemplo, una gran tabla con el significado de getPrecision / getScale para todos los tipos de SQL sería genial. ¿Hay alguna documentación como esta en algún lugar?

¿Fue útil?

Solución

Oracle no puede devolver un tipo basado en una vista o el count (*) ya que no se declaró explícitamente. Su vista podría devolver cualquier precisión o escala dependiendo de las tablas subyacentes de la vista.

Para superar esto, deberías convertir el tipo en tu consulta o vista de esta manera:

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

Otros consejos

Una alternativa es consultar user_tab_columns o all_tab_columns .

Una escala de 0 es aceptable: un NÚMERO (5) es lo mismo que un NÚMERO (5,0)

Sin embargo, la precisión debe ser un número entero entre 1 y 38 cuando está definido. Cuando no está definido, como en NÚMERO, el controlador debe devolver algo, ya que no puede devolver el valor nulo. En ese caso, el conductor elige devolver 0.

Me parece que no hay una documentación completa sobre ResultSetMetaData. Oracle® Database JDBC Guía del desarrollador y referencia 10g Versión 2 ( 10.2) y 11g versión 2 (11.2 ) da un ejemplo sobre el nombre y el tipo de columna aquí , no tratan otros aspectos.

Alguien tenía un problema similar con PostgreSQL Hace años e hizo un parche. Tal vez Oracle usa el mismo código base aquí.

Puedes intentar usar ojdbc14 _g .jar en lugar de ojdbc14.jar, ya que sus clases se compilaron con " javac -g " y contienen alguna información de rastreo.

También puede probar nuevos controladores .

Puede usar rs.getBigDecimal (columnIndex) y desde el gran decimal puede obtener los valores de precisión / escala de las columnas específicas.

No es una respuesta directa a su pregunta, sino una solución que mencionó:

Si todo lo que tiene que hacer es verificar o comparar esquemas db, en lugar de ResultSetMetaData y consultar todas las tablas, use la información del esquema de Oracle como se describe en Ingeniería inversa de un modelo de datos . Lo utilicé en mi utilidad para exportar dicha información a texto

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top