我目前正在使用 Oracle 中的 Java 存储过程,并且在尝试在我的 Java 代码中建立连接时看到一些奇怪的行为。
我的 Java 被打包成一个 jar 文件,然后使用loadjava
命令行实用程序部署到 Oracle 中。package
然后在数据库中创建A ,它将指定 Java 类中的每个方法通过调用规范映射到 PL/SQL 函数。
我正在使用的一些列是CLOB
s。在 Java 中,我尝试将 this 的值CLOB
(在调用规范中映射为oracle.sql.CLOB
)提取到 a中String
:
private static String getStringFromCLOB(CLOB clob) throws SQLException {
long length = clob.length();
return clob.getSubString(1, (int) length);
}
当我运行此代码时,我会在 SQL*Plus 中看到以下堆栈跟踪:
java.lang.ArithmeticException: / by zero
at oracle.jdbc.driver.T2SConnection.<init>(T2SConnection.java:107)
at oracle.jdbc.driver.T2SDriverExtension.getConnection(T2SDriverExtension.java:31)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:481)
at oracle.jdbc.driver.OracleDriver.defaultConnection(OracleDriver.java:505)
at oracle.sql.DatumWithConnection.getPhysicalConnection(DatumWithConnection.java:53)
at oracle.sql.DatumWithConnection.getInternalConnection(DatumWithConnection.java:177)
at oracle.sql.CLOB.getDBAccess(CLOB.java:1383)
at oracle.sql.CLOB.length(CLOB.java:197)
在我刚刚看到的消息之前,Exception
我用 a 包装了有问题的方法的内容,try / catch
这样我就可以将完整的堆栈跟踪转储到System.out
.
值得注意的是,我已经在 Oracle 11.2.0.1.0 (32bit) 上运行了这个,但它不适用于 Oracle 11.2.0.2.0 (64bit)。
我也有其他支持 Java 的 PL/SQLfunction
正常工作。只有那些试图建立连接的人才会失败。
我看过了<ORACLE_HOME>\jdbc\lib
,这些罐子虽然名称相同,但在这两个发行版中似乎有所不同。目录中的 jars 是(显示 11.2.0.1.0 大小和 11.2.0.2.0 大小):
ojdbc5.jar
(1,950KB | 1,983KB)ojdbc5_g.jar
(3,010KB | 3,271KB)ojdbc5dms.jar
(2,374KB | 2,489KB)ojdbc5dms_g.jar
(3,030KB | 3,291KB)ojdbc6.jar
(2,062KB | 2,102KB)ojdbc6_g.jar
(3,323KB | 3,782KB)ojdbc6dms.jar
(2,594KB | 2,698KB)ojdbc6dms_g.jar
(3,344KB | 3,805KB)simplefan.jar
(20KB | 20KB) <-- 可能相同
这些 jar 的清单文件确认它们是为特定版本构建的,即 11.2.0.1.0 或 11.2.0.2.0。11.2.0.2.0 中是否可能引入了错误?还是更有可能是用户,即我的错误:-)
另外,oracle.jdbc.driver.T2SConnection
班级住在哪里?
非常感谢任何帮助/指导。如果您需要更多信息,请告诉我。