我有一个应用程序,它使用普通的vanilla JDBC代码从数据库访问不同的属性。这与下面的数据库无关。
然而,它使用的一个功能要求驱动程序符合JDBC4(特别是,它试图确定一个列是否自动增加,访问连接元数据上getColumns结果的IS_AUTOINCREMENT值)
问题是,即使使用ojdbc6.jar中包含的oracle.jdbc.OracleDriver,声称符合JDBC 4,它也不会返回添加到JDBC 4中的规范的IS_AUTOINCREMENT列。这会产生一个SQLException for未知列,并使应用程序无法用于Oracle dbs。
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)WITH TIME ZONE', - 101, 'TIMESTAMP(6)与当地时区',-102, '间隔年(2)到月',-103, 'INTERVAL DAY(2)to SECOND(6)', - 104, 'BINARY_FLOAT',100,'BINARY_DOUBLE',101, 'XMLTYPE',2007, 1111) AS data_type, t.data_type AS type_name, 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,
null,-127,
t.data_scale),
t.data_scale)AS decimal_digits, 10 AS num_prec_radix, DECODE(t.nullable,'N',0,1)可以为空, 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 ordinal_position, DECODE(t.nullable,'N','NO','YES')AS is_nullable FROM all_tab_columns t WHERE t.owner LIKE :1 ESCAPE'/'和t.table_name LIKE :2 ESCAPE'/'和t.column_name LIKE :3 ESCAPE'/'ORDER BY table_schem, table_name,ordinal_position
是否有任何驱动程序/替代/解决方法?
答案 0 :(得分:4)
这可能是因为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实现在不同供应商之间确实不同。