JDBC: хранимые процедуры ORCLE с возвращаемым значением в пакетной обработке - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть JDBC-соединение с СУБД Oracle.

Мне нужно вызвать хранимую процедуру (назовем ее foo), которая возвращает число.

Работает нормально, если я выполняю каждое выражение для себя.

for (int i = 0; i < 10;i ++)
{
  CallableStatement cst = con.prepareCall ("{? = foo (" + i + ")}");
  cst.registerOutParameter (1, Types.INTEGER);
  cst.execute ();
}

СЕЙЧАС мне нравится использовать пакетную обработку для повышения производительности.Это мой подход.

Statement st = con.createStatement ();
for (int i = 0; i < 10;i ++)
{
  st.addBatch ("{? = foo (" + i + ")}");
}
st.executeBatch ();

Это не работает.

Ошибка говорит мне, что не каждая переменная назначена.Думаю, это потому, что для возвращаемого значения нет регистрации, как в рабочем примере выше.

Если я задаю для оператора

{foo (" + i + ")}

, чтобы удалить возвращаемое значение, тогда я получаюошибка в том, что процедура не определена.

Как я могу обработать такую ​​хранимую процедуру с возвращаемым значением в пакетной обработке?

1 Ответ

0 голосов
/ 19 февраля 2019

Для пакетной обработки JDBC требуется идентичный подготовленный оператор и набор переменных связывания.

Это нарушается динамическим оператором "{? = foo (" + i + ")}", сгенерированным для каждого i.

Вы должны использоватьодин оператор с двумя переменными связывания "{? = foo (?)}"

к сожалению, это приводит к исключению

Caught: java.sql.SQLException: операция не разрешена: хранимая процедура с параметрами out или inoutне может быть пакетирован

, поскольку нет возможности вернуть коллекцию вызовов функции результата из оператора пакетной обработки.

К счастью, существует очень простое альтернативное решение.Вы можете использовать prepareStatement для имитации пакетной обработки (т. Е. Вы ограничиваете обращения к серверу БД)

 def stmt = con.prepareStatement("select foo(rownum) foo from dual connect by level <= 10")

Установите сайт выборки такой же, как размер пакета и вы получите поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...