jab*_*lab 7 java oracle oracle11g java-stored-procedures
我目前正在使用Oracle中的Java存储过程,并且在尝试在Java代码中获取连接时会看到一些奇怪的行为.
我的Java被打包成一个jar文件,然后使用loadjava命令行实用程序部署到Oracle中.package然后在数据库中创建A ,该数据库通过调用规范将指定Java类中的每个方法映射到PL/SQL函数.
我正在使用的一些专栏是CLOBs.在Java中,我尝试将其值CLOB(在调用规范中映射为oracle.sql.CLOB)提取到String:
private static String getStringFromCLOB(CLOB clob) throws SQLException {
long length = clob.length();
return clob.getSubString(1, (int) length);
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,我在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)
Run Code Online (Sandbox Code Playgroud)
在我刚刚看到这样的消息之前,我Exception用一个包装了违规方法的内容,try / catch所以我可以将完整的堆栈跟踪转储到System.out.
值得注意的是,我已经将其用于Oracle 11.2.0.1.0(32位),但它不适用于Oracle 11.2.0.2.0(64位).
我还有其他Java支持的PL/SQL function工作没有问题.只有尝试使连接失败的人才会这样做.
我已经看了一下<ORACLE_HOME>\jdbc\lib,虽然这两个发行版的名称相同,但这两个发行版似乎有所不同.目录中的jar(大小为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班级住在哪里?
任何帮助/指导非常感谢.如果您需要更多信息,请与我们联系.
对于那些可能遇到此问题的人,我们发现它是由 Oracle 中的 JVM 安装损坏引起的。这可能是由于安装不当造成的。
重新安装 Oracle 的 JVM 方面,oracle.jdbc.driver.OracleConnection.defaultConnection()无论是显式调用还是作为另一个调用(例如oracle.sql.CLOB.length().