Я отлаживаю приложение Java, которое подключается к БД Oracle через тонкий клиент.
Код выглядит следующим образом: (здесь я пытаюсь упростить сценарий использования, поэтому извините, если t на самом деле не компилируется)
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".
Весь код цикла работает отлично.
Вторая итерация цикла, currency
установлена в "USD".
Вызов "execute()"
вызывает SQLException следующим образом:
ORA-01008: not all variables bound
Почему?
Первоначально я подозревал, что это как-то связано с вызовом registerOutParameter
перед циклом, который не вызывается во 2-й итерации. Но перемещение этого вызова внутри цикла не решает проблему. Кажется, что execute()
call отменяет привязку чего-либо, но наличие обеих привязок внутри цикла не помогает.
Чего мне не хватает?
Если это что-то очевидное, пожалуйста, будьте осторожны - я очень мало знаю об Oracle и тонком клиенте, и поиск в Google с множеством необычных запросов не принес любви.
Еще одна подсказка: эта конструкция работала раньше, когда приложение было на Oracle 9 с драйверами OCI. Причина, по которой я отлаживаюсь, в том, что кто-то "обновил" его до клиента Oracle 10.2, и он сломался.
Мой следующий шаг, вероятно, должен заключить в цикл целые CallableStatement
, но такой вид опровергает саму идею того, почему я, хотя подготовленные утверждения, используется в первую очередь, нет?