Ora 01002 выборка из последовательности

Когда я пытаюсь вызвать процедуру из своего приложения, получил сообщение об ошибке ORA-01002: выборка из последовательности

Интересным здесь является ошибка, возникающая только в том случае, если я использую аннотацию @Transactional (org.springframework.transaction.annotation.Transactional) для вызывающего метода в классе службы. Если я удалю @Transactional, тогда нет ошибки ORA.

Я использую @Transactional, поскольку у меня есть несколько DAO, введенных в Сервис. Пожалуйста, найдите мой код, вставленный ниже.

Любой PLS поможет мне в этом.

ORA-01002 – ошибка Oracle. Вы не указали код Oracle, поэтому нам нужно угадать, что происходит.

Эта ошибка обычно возникает при фиксации через курсор FOR UPDATE , например:

Я могу себе представить, что добавление @Transactional к единице работы заставит его зафиксировать успех/откат при ошибке. Так что, возможно, этот код является частью более крупного цикла с использованием курсора FOR UPDATE . Когда вы добавляете @Transactional , он совершает каждый раз при вызове метода, тем самым аннулируя основной курсор.

Вы также можете столкнуться с ORA-01002 если попытаетесь извлечь из курсора после откат некоторых изменений, которые сделали бы его недействительным:

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

В заключение: вы должны добавлять @Transactional к единицам, которые делают неделимый объем работы. Если этот метод является подметодом большей транзакции, он не должен совершать/откатываться самостоятельно.

"fetch out of sequence"
*Cause: This error means that a fetch has been attempted from a cursor
which is no longer valid. Note that a PL/SQL cursor loop
implicitly does fetches, and thus may also cause this error.
There are a number of possible causes for this error, including:
1) Fetching from a cursor after the last row has been retrieved
and the ORA-1403 error returned.
2) If the cursor has been opened with the FOR UPDATE clause,
fetching after a COMMIT has been issued will return the error.
3) Rebinding any placeholders in the SQL statement, then issuing
a fetch before reexecuting the statement.
*Action: 1) Do not issue a fetch statement after the last row has been
retrieved – there are no more rows to fetch.
2) Do not issue a COMMIT inside a fetch loop for a cursor
that has been opened FOR UPDATE.
3) Reexecute the statement after rebinding, then attempt to
fetch again.

Перечень ошибок взят из официального перечня ошибок Oracle версии 11R2.
Если не можете справиться – поищите эту ошибку на форуме по ссылке выше, многие ошибки мы уже разобрали.
Не получается – обязательно напишите, разберем, попробуем, пощупаем, понюхаем.
Главное – не паникуйте, но всегда, в первую очередь убедитесь, что бекап есть и сделайте бекап того, что сейчас имеете 🙂

I have one demo application to check select for update query

This works fine if i remove For update from select query otherwise give me error

4 Answers 4

SELCT . FOR UPDATE only makes sense in the context of a managed transaction, since it requires locks to be taken out on the selected rows.

By default, JDBC does not use a managed transaction, it uses an implicitly created one that commits as soon as the query is executed. This will break the semantics of SELECT . FOR UPDATE , and the JDBC driver complains.

Оцените статью
ПК Знаток
Добавить комментарий

Adblock
detector