Uno dei compiti di OJDBC consiste nel mappare i tipi di dati Oracle in tipi Java.Perché OJDBC 7 non associa il tipo di dati CHAR a una stringa Java?
Tuttavia, abbiamo notato che se diamo un tipo di dati CHAR
, non è mappato a java.lang.String
. Le versioni che mostrano questo comportamento sono: OJDBC7 v12.1.0.2 e OJDBC6 v12.1.0.1. Le versioni precedenti effettivamente mappavano il tipo di dati CHAR
a: java.lang.String
.
a scavare più a fondo, abbiamo scoperto che c'è una classe: StructMetaData
all'interno del pacchetto di OJDBC oracle.jdbc.driver
che implementa il tipo di dati Oracle per Java Tipo mappatura. C'è un metodo al suo interno: 'getColumnClassName (int arg0)' che è degno di attenzione. Abbiamo notato che per OJDBC v7, i casi mappati java.lang.String
sono i seguenti:
int arg1 = this.getColumnType(arg0);
switch (arg1) {
case -104:
return "oracle.sql.INTERVALDS";
case -103:
return "oracle.sql.INTERVALYM";
case -102:
return "oracle.sql.TIMESTAMPLTZ";
case -101:
return "oracle.sql.TIMESTAMPTZ";
case -15:
case -9:
case 12:
return "java.lang.String";
...
Tuttavia, all'interno di implementazioni OJDBC più anziani, che si presentava così:
int arg1 = this.getColumnType(arg0);
switch (arg1) {
case -104:
return "oracle.sql.INTERVALDS";
case -103:
return "oracle.sql.INTERVALYM";
case -102:
return "oracle.sql.TIMESTAMPLTZ";
case -101:
return "oracle.sql.TIMESTAMPTZ";
case -15:
case -9:
case 1:
case 12:
return "java.lang.String";
...
V'è un ulteriore caso mappato java.lang.String
in quest'ultimo caso vale a dire 'caso 1'. Questo 'caso 1' non è mappato a java.lang.String
nel primo frammento di codice mostrato sopra.
Guardando più profondo, questo 'caso 1' viene mappata CHAR
all'interno del metodo getColumnTypeName(int arg0)
della stessa classe StructMetaData
:
public String getColumnTypeName(int arg0) throws SQLException {
int arg1 = this.getColumnType(arg0);
int arg2 = this.getValidColumnIndex(arg0);
switch (arg1) {
case -104:
return "INTERVALDS";
case -103:
return "INTERVALYM";
case -102:
return "TIMESTAMP WITH LOCAL TIME ZONE";
case -101:
return "TIMESTAMP WITH TIME ZONE";
case -15:
return "NCHAR";
case -13:
return "BFILE";
case -9:
return "NVARCHAR";
case -2:
return "RAW";
case 1:
return "CHAR";
...
Per questo motivo, se usiamo OJDBC 7 o OJDBC6 v12.1.0.1 e specificare CHAR
come tipo di dati per una colonna, il seguente codice restituisce null
su invocazione per l'indice di questa colonna:
for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
...
resultSetMetaData.getColumnClassName(columnIndex)
...
Se sostituisco una versione precedente del vaso OJDBC (ad esempio: 11.2.0.3), quindi restituisce lo stesso codice: java.lang.String
. È un bug o è stato rimosso dalla progettazione? Qualcuno ha affrontato lo stesso problema in precedenza?
Avete controllato le note di rilascio del driver? Se ritieni che ciò sia sbagliato, apri una SR con My Oracle Support. Sono rimasto molto contento delle soluzioni offerte. –