Oracle驱动程序与JDBC4完全兼容

时间:2010-11-23 04:44:01

标签: java oracle jdbc oracle10g

我有一个应用程序,它使用普通的vanilla 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

问题是,即使使用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

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

1 个答案:

答案 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实现在不同供应商之间确实不同。