シン クライアント経由で Oracle DB に接続する Java アプリケーションをデバッグしています。
コードは次のようになります。
Connection conn = myEnv.getDbConnection();
CallableStatement call = conn.prepareCall(
"{ ? = call SomePackage.SomeFunction (?)}");
call.registerOutParameter(1, OracleTypes.CURSOR);
for (int runCount = 0; runCount <= 1; runCount++) {
currency = getCurrency(runCount); // NOTE: [0]=CAD, [1]=USD
call.setString(2, currency);
try { call.execute(); } catch { // BREAKS HERE! }
ResultSet rset = (ResultSet)call.getObject(1);
... more code that I think is irrelevant as it does not use/affect "call"
}
このコードを実行すると、次のことが起こります。
ループの最初の反復は、
currency
「CAN」に設定されます。ループのコード全体が完全に正常に実行されます。
ループの 2 回目の反復では、
currency
"USD" が設定されます。この
"execute()"
呼び出しは、次のように SQLException をスローします。ORA-01008: not all variables bound
なんで?
私の最初の疑いは、registerOutParameter
2D 反復で呼び出されないループの前の呼び出しに何らかの形で関連しているということでした。しかし、その呼び出しをループ内に移動しても問題は解決しません。call は何かのバインドを解除しているようexecute()
ですが、ループ内に両方のバインディングを含めることは役に立ちません。
私は何が欠けていますか?
それが明らかな場合は、優しくしてください-私はOracleとシンクライアントについてほとんど知りません。
1 つの追加の手がかり: この設計は、アプリが OCI ドライバーを使用して Oracle 9 にあった以前は機能していたようです。私がデバッグしている理由は、誰かがそれを Oracle 10.2 thi クライアントに「アップグレード」して壊れたからです。
私の次のステップはおそらくCallableStatement
ループ全体に持ち込むことですが、そのようなことは、そもそもなぜ準備済みステートメントが使用されているのかという考え全体を打ち負かしますよね?