現在、OracleでJavaストアドプロシージャを使用していますが、Javaコード内で接続を取得しようとすると奇妙な動作が見られます。
私のJavaはjarファイルにパッケージ化されてから、loadjavaコマンドラインユーティリティを使用してOracleにデプロイされます。次に、データベースにApackageが作成され、指定されたJavaクラスの各メソッドが呼び出し仕様を介してPL/SQL関数にマップされます。
私が扱っている列のいくつかはCLOBsです。CLOBJavaでは、これの値(呼び出し仕様にとしてマップされているoracle.sql.CLOB)を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、問題のあるメソッドの内容をでラップしてtry / catch、完全なスタックトレースをにダンプできるようにしましたSystem.out。
これはOracle11.2.0.1.0(32ビット)では機能していましたが、Oracle 11.2.0.2.0(64ビット)では機能していません。
他のJavaベースのPL/SQLfunctionも問題なく動作しました。失敗するのは接続を確立しようとするものだけです。
私が調べた<ORACLE_HOME>\jdbc\libところ、jarは同じ名前ですが、これら2つのディストリビューションでは異なっているようです。ディレクトリ内の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クラスはどこに住んでいますか?
どんな助け/ガイダンスも大歓迎です。さらに詳しい情報が必要な場合はお知らせください。