Một trong những công việc của OJDBC là ánh xạ các kiểu dữ liệu Oracle với các kiểu Java.Tại sao OJDBC 7 ánh xạ loại dữ liệu CHAR thành một chuỗi Java?
Tuy nhiên, chúng tôi nhận thấy rằng nếu chúng tôi cung cấp loại dữ liệu CHAR
, thì nó không được ánh xạ tới java.lang.String
. Các phiên bản hiển thị hành vi này là: OJDBC7 v12.1.0.2 và OJDBC6 v12.1.0.1. Các phiên bản cũ đã thực sự ánh xạ loại dữ liệu CHAR
đến: java.lang.String
.
Khi đào sâu hơn, chúng tôi phát hiện ra rằng có một lớp: StructMetaData
trong gói OJDBC oracle.jdbc.driver
triển khai thực hiện kiểu dữ liệu Oracle đối với ánh xạ kiểu Java. Có một phương thức bên trong nó: 'getColumnClassName (int arg0)' đáng chú ý. Chúng tôi nhận thấy rằng cho OJDBC v7, các trường hợp ánh xạ tới java.lang.String
như sau:
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";
...
Tuy nhiên, trong triển khai OJDBC già đi, nó trông như thế này:
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";
...
Có một trường hợp thêm ánh xạ tới java.lang.String
trong trường hợp sau viz. 'trường hợp 1'. 'Trường hợp 1' này không được ánh xạ tới java.lang.String
trong đoạn mã đầu tiên được hiển thị ở trên.
On nhìn sâu hơn, 'trường hợp 1' này được ánh xạ tới CHAR
trong phương pháp getColumnTypeName(int arg0)
của lớp cùng 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";
...
Bởi vì điều này, nếu chúng ta sử dụng OJDBC 7 hoặc OJDBC6 v12.1.0.1 và chỉ định CHAR
như kiểu dữ liệu cho một cột, các mã sau trả null
trên gọi cho chỉ mục của cột này:
for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
...
resultSetMetaData.getColumnClassName(columnIndex)
...
Nếu tôi thay thế một phiên bản cũ của jar OJDBC (ví dụ: 11.2.0.3), sau đó cùng một mã trả về: java.lang.String
. Đây có phải là lỗi hoặc bị xóa bởi thiết kế không? Có ai phải đối mặt với cùng một vấn đề trước đây không?
Bạn đã kiểm tra ghi chú phát hành của tài xế chưa? Nếu bạn nghĩ rằng điều này là sai, mở một SR với hỗ trợ Oracle của tôi. Tôi hài lòng nhất với các giải pháp được cung cấp. –