Domanda

Sto usando il thin driver JDBC di Oracle (10.2.0.3) per la connessione a un database Oracle 10g. Vorrei ottenere informazioni sulle colonne del database, quindi utilizzo ResultSetMetaData . Le informazioni più importanti di cui ho bisogno sono il tipo di colonna e la lunghezza, quindi uso getColumnType , getPrecision e metodi getScale .

Funziona con una query semplice ( select * from tablename ) se il tipo di colonna è " simple " come VARCHAR2 (50), NUMBER (5), NUMBER (6,2) . Se ho una query più complessa ( select count (*) da tablename ) o una query basata su una vista che contiene alcuni calcoli complessi, i metodi danno risultati strani come:

  • getScale : -127
  • sia getPrecision che getScale è 0
  • getPrecision : -1

L'impostazione della proprietà di connessione oracle.jdbc.J2EE13Compliant su true (come suggerito da diverse pagine Web) elimina getScale = -127 ma restituisce comunque il risultato 0/0.

Molto probabilmente devo creare una soluzione per questi strani risultati, ma prima ho bisogno di almeno una documentazione completa sul comportamento di ResultSetMetaData di Oracle. Ad esempio, una grande tabella con il significato di getPrecision / getScale per tutti i tipi di SQL sarebbe ottima. Esiste una documentazione come questa da qualche parte?

È stato utile?

Soluzione

Oracle non può restituire un tipo basato su una vista o sul count (*) poiché non è stato dichiarato esplicitamente. La tua vista potrebbe restituire qualsiasi precisione o scala a seconda delle tabelle di base della vista.

Per ovviare a questo problema, è necessario eseguire il cast del tipo nella query o visualizzare in questo modo:

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

Altri suggerimenti

Un'alternativa è interrogare user_tab_columns o all_tab_columns .

Una scala di 0 è accettabile: un NUMERO (5) è uguale a un NUMERO (5,0)

La precisione tuttavia deve essere un numero intero compreso tra 1 e 38 quando viene definita. Quando non è definito, come in NUMBER, il driver deve restituire qualcosa poiché non può restituire null. In tal caso il driver sceglie di restituire 0.

Mi sembra che non ci sia documentazione completa su ResultSetMetaData. Oracle & # 174; Database Guida dello sviluppatore JDBC e riferimento 10g versione 2 (10.2) e 11g Release 2 (11.2) fornisce esempi sul nome e sul tipo di colonna qui , non trattano altri aspetti.

Qualcuno ha un problema simile con PostgreSQL anni fa e ha fatto una patch. Forse Oracle usa la stessa base di codice qui.

Puoi provare a utilizzare ojdbc14 _g .jar anziché ojdbc14.jar poiché le sue classi sono state compilate con " javac -g " e contiene alcune informazioni di traccia.

Puoi anche provare driver più recenti .

Puoi usare rs.getBigDecimal (columnIndex) e dal grande decimale puoi ottenere i valori di precisione / scala delle colonne specifiche.

Non una risposta diretta alla tua domanda, ma una soluzione alternativa che hai menzionato:

Se tutto ciò che devi fare è controllare o confrontare gli schemi db, allora invece di ResultSetMetaData e interrogando tutte le tabelle usa le informazioni sullo schema Oracle come descritto in Reverse engineering a Data Model . L'ho usato nella mia utility per esportare tali informazioni in testo

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top