Eine der Aufgaben von OJDBC besteht darin, Oracle-Datentypen Java-Typen zuzuordnen.Warum ordnet OJDBC 7 den CHAR-Datentyp einem Java-String zu?
Allerdings haben wir festgestellt, dass, wenn wir einen CHAR
Datentyp geben, es nicht auf java.lang.String
zugeordnet ist. Die Versionen mit diesem Verhalten sind: OJDBC7 v12.1.0.2 und OJDBC6 v12.1.0.1. Die älteren Versionen haben tatsächlich den CHAR
Datentyp zugeordnet: java.lang.String
.
Bei genauerem Hinsehen haben wir festgestellt, dass es eine Klasse gibt: StructMetaData
innerhalb des oracle.jdbc.driver
Pakets von OJDBC, das den Oracle-Datentyp in Java-Typ-Mapping implementiert. Es gibt eine Methode darin: 'getColumnClassName (int arg0)', die Aufmerksamkeit verdient. Wir haben festgestellt, dass für OJDBC v7, die abgebildeten Fälle java.lang.String
sind wie folgt:
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";
...
jedoch innerhalb älteren OJDBC Implementierungen, es sah wie folgt aus:
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";
...
ein zusätzlicher Fall java.lang.String
abgebildet ist im letzteren Fall nämlich. 'Fall 1'. Dieser "Fall 1" wird nicht im ersten Codeausschnitt, der oben gezeigt wird, auf java.lang.String
abgebildet.
Auf der Suche tiefer, dieser ‚Fall 1‘ zu CHAR
im getColumnTypeName(int arg0)
Verfahren derselben StructMetaData
Klasse zugeordnet:
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";
...
Aus diesem Grund, wenn wir benutzen OJDBC 7 oder OJDBC6 v12.1.0.1 und geben Sie CHAR
als Datentyp für eine Spalte, die folgende Code gibt null
beim Aufruf für diesen Spalt Index:
for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
...
resultSetMetaData.getColumnClassName(columnIndex)
...
Wenn ich ersetzen eine ältere Version des OJDBC jar (zum Beispiel: 11.2.0.3), dann gibt derselbe Code zurück: java.lang.String
. Ist das ein Fehler oder wurde es vom Design entfernt? Hat jemand schon einmal mit dem gleichen Problem konfrontiert?
Haben Sie die Versionshinweise des Treibers überprüft? Wenn Sie dies für falsch halten, öffnen Sie eine SR mit My Oracle Support. Ich war sehr zufrieden mit den angebotenen Lösungen. –