Вы не можете повторно использовать оператор, перебирая набор результатов, созданный этим оператором, для выполнения другого запроса (или любого другого типа оператора) для этого объекта Statement
, который автоматически закроет набор результатов предыдущего выполнения запроса. Это требуется API JDBC и спецификацией.
Если вы хотите сделать это, вам нужно отключить автоматическую фиксацию * и использовать два объекта оператора.
Однако код, который вы показываете, является анти-шаблоном, известным как проблема запроса N + 1, в общем, вы не должны циклически повторять набор результатов для выполнения других отдельных выборок в строке: вы можете создать один оператор выбора, который это делает для тебя. Обычно это работает намного лучше.
Например, вы можете использовать:
select V_F_BATCH.RECID, F_BATCH.XMLRECORD
from V_F_BATCH
inner join F_BATCH
on F_BATCH.RECID = V_F_BATCH.RECID
where V_F_BATCH.BATCH_STAGE is not NULL
Это также позволит избежать потенциальной проблемы с внедрением SQL в вашем текущем коде.
*: Отключение автоматической фиксации необходимо, поскольку JDBC требует выполнения любого оператора для фиксации в режиме автоматической фиксации. И фиксация также закроет открытые наборы результатов, если они не будут удерживаться над фиксацией (хотя некоторые драйверы JDBC снисходительны в этом отношении и набор результатов не будет закрыт на границе автоматической фиксации).