Одной из задач OJDBC является сопоставление типов данных Oracle с типами Java.
Однако мы заметили, что если мы указываем тип данных CHAR
, он не сопоставляется с java.lang.String
. Это происходит в следующих версиях: OJDBC7 v12.1.0.2 и OJDBC6 v12.1.0.1. Более старые версии действительно отображали тип данных CHAR
на: java.lang.String
.
Копнув глубже, мы обнаружили, что существует класс: StructMetaData
в пакете oracle.jdbc.driver
OJDBC, который реализует сопоставление типа данных Oracle с типом Java. В нем есть метод: 'getColumnClassName(int arg0)', достойный внимания. Мы заметили, что для OJDBC v7 случаи, сопоставленные с java.lang.String
, следующие:
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";
...
Однако в старых реализациях OJDBC это выглядело так:
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";
...
В последнем случае есть дополнительный случай, сопоставленный с java.lang.String
, а именно. 'Дело 1'. Этот «случай 1» не сопоставлен с java.lang.String
в первом фрагменте кода, показанном выше.
При более глубоком рассмотрении этот «случай 1» сопоставляется с CHAR
в методе getColumnTypeName(int arg0 )
того же класса 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";
...
Из-за этого, если мы используем OJDBC 7 или OJDBC6 v12.1.0.1 и указываем CHAR
в качестве типа данных для столбца, следующий код возвращает null
при вызове для индекса этого столбца:
for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
...
resultSetMetaData.getColumnClassName(columnIndex)
...
Если я заменю более старую версию файла jar OJDBC (например: 11.2.0.3), то будет возвращен тот же код: java.lang.String
. Это баг или его убрали специально? Кто-нибудь сталкивался с такой же проблемой раньше?