2010-11-23 20 views
1

我有一个应用程序使用普通的vanilla JDBC代码来访问数据库中的不同属性。这与底下的数据库无关。Oracle驱动程序与JDBC4完全兼容

但是它使用的特征中的一个需要驾驶员为符合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,号称是JDBC 4标准的Oracle的oracle.jdbc.OracleDriver,它没有返回IS_AUTOINCREMENT列添加到规范的JDBC 4 。这会为未知列生成SQLException,并使应用程序对Oracle dbs不可用。

通过Oracle的驱动程序执行的SQL查询如下:

SELECT NULL作为TABLE_CAT, t.owner AS TABLE_SCHEM, t.table_name AS表名, t.column_name AS列名, 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 , 'T (2)至第二(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', 吨。 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 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 isulullable 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

SQLException是否包含任何细节? – 2010-11-23 04:58:46

+0

该列不存在于结果集中。我添加执行的查询来说明。 – Johnco 2010-11-23 05:09:42

回答

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实现真的不同于一个供应商。

相关问题