2010-11-23 22 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實現真的不同於一個供應商。

相關問題