Java / Oracle: выполнение подготовленного оператора завершается неудачно на второй итерации цикла (не все переменные связаны). Зачем? - PullRequest
0 голосов
/ 11 октября 2009

Я отлаживаю приложение 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, но такой вид опровергает саму идею того, почему я, хотя подготовленные утверждения, используется в первую очередь, нет?

Ответы [ 2 ]

0 голосов
/ 28 октября 2009

Объяснение, полученное с помощью обращения в службу поддержки Oracle, заключалось в том, что эта версия Java (1.3) была несовместима с новым Oracle. Java 1.4 исправила проблему.

0 голосов
/ 11 октября 2009

Вы пытались добавить call.clearParameters() в цикл? Возможно, это приведет к сбросу некоторого внутреннего состояния объекта, который необходимо выполнить снова.

...