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