Oracle JDBC驱动程序中的大错误,用于混合大小写的表/列名称?

时间:2016-03-28 06:28:03

标签: oracle jdbc

这似乎相当令人惊讶,但我很确定我们在Oracle的JDBC驱动程序(版本12.1.0.2和11.2.0.4)中发现了一个重要的错误。这是架构:

create sequence MYSEQ increment by 1 start with 1 nocache;
create table "MixedCaseTable"(IDENT int);

这是Java代码:

conn.prepareStatement("insert into \"MixedCaseTable\" " +
"(IDENT) VALUES (MYSEQ.nextval)",
new int[]{1});

令我惊讶的是,这引发了一个例外:

Exception in thread "main" java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:459)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:392)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:384)
at oracle.jdbc.driver.T4CTTIfun.processError(T4CTTIfun.java:767)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:539)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:235)
at oracle.jdbc.driver.T4C8Odscrarr.doODNY(T4C8Odscrarr.java:96)
at oracle.jdbc.driver.T4CConnection.doDescribeTable(T4CConnection.java:7555)
at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:12886)
at PStest.main(PStest.java:11)

如果我使用不同的prepareStatement:

conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

工作正常。

如果表名是全部大写(MYTABLE或甚至" MYTABLE"),那也可以。

这个问题可以在没有序列的情况下重现,例如:

conn.prepareStatement("insert into \"MixedCaseTable\" " +
"(IDENT) VALUES (1)",
new int[]{1});

这意味着,对于并非全部大写的所有表名和列名,都会完全破坏这种prepareStatement的风格 - 任何需要引用的名称。

现在,我没有反编译Oracle的驱动程序,因为这可能是非法的或者其他东西,但我有一个朋友告诉我他将这个问题追溯到JDBC驱动程序 - 类AutoKeyInfo,方法getTableName,问题与强制SQL为所有内容的所有上限有关。

解决方法包括使用另一个版本的prepareStatement(使用Statement.RETURN_GENERATED_KEYS),获取ROWID,然后从中检索行,但这是一个额外的查询,这看起来似乎是asinine。 / p>

我错过了什么吗?肯定是这个大不了多年的错误?

0 个答案:

没有答案