Jednym z zadań OJDBC jest mapowanie typów danych Oracle na typy Java.Dlaczego OJDBC 7 nie mapuje typu danych CHAR na ciąg Java?
Zauważyliśmy jednak, że jeśli podajemy typ danych CHAR
, nie jest on mapowany na java.lang.String
. Wersje pokazujące to zachowanie to: OJDBC7 v12.1.0.2 i OJDBC6 v12.1.0.1. Starsze wersje rzeczywiście mapowały typ danych CHAR
na: java.lang.String
.
Po głębszym wykopaniu odkryliśmy, że istnieje klasa: StructMetaData
w pakiecie OJDBC oracle.jdbc.driver
implementująca typ danych Oracle do odwzorowania typu Java. Jest w nim pewna metoda: "getColumnClassName (int arg0)", na którą warto zwrócić uwagę. Zauważyliśmy, że na OJDBC v7, przypadki odwzorowane na java.lang.String
są następujące:
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";
...
Jednak w starszych implementacjach OJDBC, wyglądało to tak:
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";
...
Istnieje dodatkowy przypadek odwzorowane na java.lang.String
w tym ostatnim przypadku mianowicie. 'przypadek 1'. Ten "przypadek 1" nie jest odwzorowany na java.lang.String
w pierwszym urywku kodu pokazanym powyżej.
Na patrząc głębiej, to 'case 1' jest mapowany do CHAR
w metodzie getColumnTypeName(int arg0)
tego samego StructMetaData
Klasa:
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";
...
Z tego powodu, jeśli używamy OJDBC 7 lub OJDBC6 v12.1.0.1 i określić CHAR
jako typ danych dla kolumny, następujący kod zwróci null
na inwokacji do indeksu Ta kolumna jest:
for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
...
resultSetMetaData.getColumnClassName(columnIndex)
...
Gdybym zastąpić starszą wersję słoika OJDBC (na przykład: 11.2.0.3), następnie ten sam kod zwraca: java.lang.String
. Czy jest to błąd, czy został usunięty przez projekt? Czy ktoś wcześniej zmierzył się z tym samym problemem?
Czy sprawdziłeś informacje o wydaniu sterownika? Jeśli uważasz, że to jest złe, otwórz SR ze wsparciem My Oracle. Byłem bardzo zadowolony z oferowanych rozwiązań. –