繁体   English   中英

Oracle驱动程序真正与JDBC4兼容

[英]Oracle driver REALLY compatible with JDBC4

我有一个使用普通的JDBC原始代码访问数据库中不同属性的应用程序。 这与下面的数据库无关。

但是,它使用的功能之一要求驱动程序与JDBC4兼容(特别是,它试图确定是否根据连接元数据上getColumns的结果访问IS_AUTOINCREMENT的值来自动增加列)

请参阅: http : //download.oracle.com/javase/6/docs/api/java/sql/DatabaseMetaData.html#getColumns%28java.lang.String,%20java.lang.String,%20java.lang.String, %20java.lang.String%29

事实是,即使使用声称符合JDBC 4的ojdbc6.jar中包含的Oracle的oracle.jdbc.OracleDriver,它也不会返回添加到JDBC 4规范中的IS_AUTOINCREMENT列。这会为未知列产生SQLException ,并使该应用程序不可用于Oracle数据库。

Oracle驱动程序执行的sql查询如下:

SELECT NULL AS table_cat,t.owner AS table_schem,t.table_name AS table_name,t.column_name AS column_name,DECODE(t.data_type,'CHAR',1,'VARCHAR2',12,'NUMBER',3,'LONG' ,-1,'DATE',93,'RAW',-3,'LONG RAW',-4,
'BLOB',2004,'CLOB',2005,'BFILE',-13,'FLOAT',6,'TIMESTAMP(6)',93,'TIMESTAMP(6)带时区',-101,'TIMESTAMP( 6)使用本地时区”,-102,“间隔年(2)到月”,-103,“间隔天(2)到第二(6)”,-104,“ BINARY_FLOAT”,100,“ BINARY_DOUBLE”, 101,'XMLTYPE',2007,1111)AS数据类型,t.data_type AS类型名称,DECODE(t.data_precision,null,DECODE(t.data_type,'CHAR',t.char_length,
'VARCHAR',t.char_length,
'VARCHAR2',t.char_length,
'NVARCHAR2',t.char_length,
'NCHAR',t.char_length,
'NUMBER',0,t.data_length),t.data_precision)AS column_size,0 AS buffer_length,DECODE(t.data_type,'NUMBER',DECODE(t.data_precision,
空-127
t.data_scale),
t.data_scale)AS十进制数字,10 AS num_prec_radix,DECODE(t.nullable,'N',0,1)AS nullable,NULL AS注释,t.data_default AS column_def,0 AS sql_data_type,0 AS sql_datetime_sub,t.data_length AS char_octet_length,t.column_id AS序数位置,DECODE(t.nullable,'N','NO','YES')AS在从all_tab_columns t所在的所有者处是null.t.owner LIKE:1 ESCAPE'/'AND t.table_name LIKE:2 ESCAPE '/'AND t.column_name喜欢:3逃逸'/'ORDER BY table_schem,table_name或ordinal_position

是否有任何驱动程序/替代方法/解决方法?

好吧,这可能是因为IS_AUTOINCREMENT属性与Oracle数据库无关。

当然,如果所有JDBC驱动程序都真正符合该规范,那会更容易,但是通常并非如此。 如API规范中所述,在无法确定列是否自动递增时, Resultset.getString("IS_AUTOINCREMENT")应该至少返回一个空字符串。

如果要模拟此行为,建议您使用以下代码:

String isAutoincrement = "";
try {
    isAutoincrement = rset.getString("IS_AUTOINCREMENT");
} catch (SQLException sqle) {
    log.warn("IS_AUTOINCREMENT attribute could not be retrieved", sqle);
}

如果打算开发与数据库无关的应用程序,则还应考虑将此技巧用于其他属性,例如“ REMARKS”或“ COLUMN_DEF”。 更一般地说,您的代码应该具有防御性,因为JDBC实现在不同供应商之间确实有所不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM