Java Oracle驱动程序与JDBC4真正兼容
我有一个应用程序,它使用普通的JDBC代码从数据库访问不同的属性。这与下面的数据库无关 但是,它使用的一个功能要求驱动程序与JDBC4兼容(特别是,它试图确定一列是否自动递增访问连接元数据上getColumns结果的is_AUTOINCREMENT值) 见: 问题是,即使使用ojdbc6.jar中包含的Oracle的Oracle.jdbc.OracleDriver(它声称与jdbc 4兼容),它也不会返回添加到jdbc 4规范中的is_AUTOINCREMENT列。这将为未知列生成SQLException,并使应用程序无法用于Oracle dbs Oracle驱动程序执行的sql查询如下: 选择NULL作为表\u cat, t、 所有者作为表\u方案, t、 表名称作为表名称, t、 列名称作为列名称, 解码(t.数据类型,'CHAR',1,'VARCHAR2',12,'NUMBER',3, '长',-1'日期',93'原始',-3'原始',-4,Java Oracle驱动程序与JDBC4真正兼容,java,oracle,jdbc,oracle10g,Java,Oracle,Jdbc,Oracle10g,我有一个应用程序,它使用普通的JDBC代码从数据库访问不同的属性。这与下面的数据库无关 但是,它使用的一个功能要求驱动程序与JDBC4兼容(特别是,它试图确定一列是否自动递增访问连接元数据上getColumns结果的is_AUTOINCREMENT值) 见: 问题是,即使使用ojdbc6.jar中包含的Oracle的Oracle.jdbc.OracleDriver(它声称与jdbc 4兼容),它也不会返回添加到jdbc 4规范中的is_AUTOINCREMENT列。这将为未知列生成SQLExce
“BLOB”,2004年,“CLOB”,2005年,“BFILE”,-13,“FLOAT”,6, “时间戳(6)”,93,“带时区的时间戳(6)”,-101, “带有本地时区的时间戳(6)”,-102, “间隔年(2)至月”, '间隔日(2)至第二(6)'-104, “二进制浮点”,100,“二进制双精度”,101, “XMLTYPE”,2007年, 1111) 作为数据类型, t、 数据类型作为类型名称, 解码(t.data_精度,空,解码(t.data_类型,'CHAR', t、 字符长度,
“VARCHAR”,t.char\u长度,
“VARCHAR2”,t.char\u长度,
“NVARCHAR2”,t.char\u长度,
“NCHAR”,t.char\u长度,
“数字”,0,t.数据长度), t、 数据(精度) 作为列的大小, 0作为缓冲区长度, 解码(t.数据类型,“数字”,解码(t.数据精度,
空,-127,
t、 数据量表),
t、 数据(刻度)为十进制数字, 10作为num_prec_基数, 将(t.nullable,'N',0,1)解码为可空, 作为备注无效, t、 数据默认为列定义, 0作为sql\u数据类型, 0作为sql\u日期时间\u子项, t、 数据长度为字符八位字节长度, t、 列id作为序号位置, 将(t.nullable,'N','NO','YES')解码为可从 t.owner喜欢的所有\u选项卡\u列 :1转义“/”和t.table_名称类似 :2转义“/”和t.column\u名称类似 :3按表模式转义“/”顺序, 表名称,序号位置
有什么驱动程序/替代方案/解决方法吗?这可能是因为
Is\u 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);
}
字符串isAutoincrement=“”;
试一试{
isAutoincrement=rset.getString(“IS_AUTOINCREMENT”);
}捕获(SQLException sqle){
log.warn(“无法检索IS_自动增量属性”,sqle);
}
如果你打算开发一个数据库不可知的应用程序,你也应该考虑使用这个技巧来做其他的属性,例如“备注”或“CulnNoDeF”。更一般地说,您的代码应该是真正具有防御性的,因为JDBC实现在不同的供应商之间是完全不同的。
这可能是因为is\u 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);
}
字符串isAutoincrement=“”;
试一试{
isAutoincrement=rset.getString(“IS_AUTOINCREMENT”);
}捕获(SQLException sqle){
log.warn(“无法检索IS_自动增量属性”,sqle);
}
如果你打算开发一个数据库不可知的应用程序,你也应该考虑使用这个技巧来做其他的属性,例如“备注”或“CulnNoDeF”。更一般地说,您的代码应该是防御性的,因为不同供应商的JDBC实现确实不同。
SQLException是否包含任何详细信息?结果集中不存在该列。我添加执行的查询是为了说明。SQLException是否包含任何详细信息?结果集中不存在该列。我添加执行的查询是为了举例说明,重点是Oracle不做自动增量列。你必须制作一个序列,并用触发器将其连接到列。@Tom,这就是为什么我说它与Oracle无关,但你是对的,我应该在我的回答中更具体一些。我应该更具体一些,我只是在扩展你的精细回答!关键是Oracle不做自动增量列。你必须制作一个序列,并用触发器将其连接到列。@Tom,这就是为什么我说它与Oracle无关,但你是对的,我应该在我的回答中更具体一些。我应该更具体一些,我只是在扩展你的精细回答!