現在、OracleでJavaストアドプロシージャを使用していますが、Javaコード内で接続を取得しようとすると奇妙な動作が見られます。
私のJavaはjarファイルにパッケージ化されてから、loadjava
コマンドラインユーティリティを使用してOracleにデプロイされます。次に、データベースにApackage
が作成され、指定されたJavaクラスの各メソッドが呼び出し仕様を介してPL/SQL関数にマップされます。
私が扱っている列のいくつかはCLOB
sです。CLOB
Javaでは、これの値(呼び出し仕様にとしてマップされている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
クラスはどこに住んでいますか?
どんな助け/ガイダンスも大歓迎です。さらに詳しい情報が必要な場合はお知らせください。