Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Oracle驱动程序与JDBC4真正兼容_Java_Oracle_Jdbc_Oracle10g - Fatal编程技术网

Java Oracle驱动程序与JDBC4真正兼容

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

我有一个应用程序,它使用普通的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,
“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无关,但你是对的,我应该在我的回答中更具体一些。我应该更具体一些,我只是在扩展你的精细回答!