gpt4 book ai didi

java - 真正兼容 JDBC4 的 Oracle 驱动程序

转载 作者:行者123 更新时间:2023-11-29 03:59:51 24 4
gpt4 key购买 nike

我有一个应用程序使用普通 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 的 oracle.jdbc.OracleDriver(它声称是 JDBC 4 兼容的),它也不会返回添加到 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) WITH TIME ZONE', -101, 'TIMESTAMP(6) WITH LOCAL TIME ZONE', -102, 'INTERVAL YEAR(2) TO MONTH', -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) AS nullable, NULL AS remarks, 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 '/' AND t.table_name LIKE :2 ESCAPE '/' AND t.column_name LIKE :3 ESCAPE '/' 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 实现因供应商而异。

关于java - 真正兼容 JDBC4 的 Oracle 驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4252840/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com