OJDBCの仕事の1つは、Oracleデータ型をJava型にマップすることです。OJDBC 7がCHARデータ型をJava文字列にマップしないのはなぜですか?
ただし、CHAR
データ型を指定すると、java.lang.String
にはマッピングされません。この動作を示すバージョンは、OJDBC7 v12.1.0.2およびOJDBC6 v12.1.0.1です。以前のバージョンでは、CHAR
のデータ型は実際にjava.lang.String
にマップされていました。
深く掘り下げて調べると、Oracleデータ型からJava型へのマッピングを実装するOJDBCパッケージStructMetaData
がOWDBCのoracle.jdbc.driver
パッケージ内に存在することが発見されました。その中にメソッドがあります: 'getColumnClassName(int arg0)'は注意が必要です。私たちは、次のようにOJDBC v7のため、java.lang.String
にマッピングされた例があることに気づい: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 1:
case 12:
return "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の実装の中に、それはこのように見えました後者の場合、すなわち、 'ケース1'。この 'ケース1'は、上記の最初のコードスニペットのjava.lang.String
にはマッピングされません。このため
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使用している場合:深いご覧の上、
は、この「ケース1」と同じStructMetaData
クラスのgetColumnTypeName(int arg0)
メソッド内CHAR
にマッピングされていますそして、列のデータ型としてCHAR
を指定し、次のコードは、この列のインデックスのための呼び出しにnull
を返します。
for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
...
resultSetMetaData.getColumnClassName(columnIndex)
...
私は例えば(OJDBCジャーの古いバージョンを交換する場合: 11.2.0.3)、同じコードが返されます:java.lang.String
。これはバグですか?それとも設計上削除されましたか? 前に誰かが同じ問題に直面したことがありますか?
ドライバのリリースノートを確認しましたか?これが間違っていると思われる場合は、My Oracle SupportでSRを開きます。私は提供されたソリューションに最も満足していました。 –