Краткий ответ - «Нет».
Oracle не делает никаких прогнозов относительно данных, которые сохранились в таблицах БД.
Это не детерминировано c вещь.
Единственное, что Oracle do for you - это мягкий анализ ваших SQL -s.
Псевдокод в вашем вопросе немного сбивает с толку.
В реальном коде вы должны сделать выбор для обновления какой-либо переменной и затем обработать эту переменную.
Возможно, часть ответа на ваш вопрос скрыта в вашем метод обработки переменных.
Существует много способов избежать обработки части кода.
Если вы используете SELECT INTO простую скалярную переменную, тогда вы получите NO DATA FOUND исключение, и UPDATE не последует.
Если вы используйте объем в коллекцию и IN (ВЫБРАТЬ ИЗ ТАБЛИЦЫ (моя коллекция)) тогда у вас нет исключений и нет ОБНОВЛЕНИЙ .
Несколько советов по производительности:
- Может быть, вы хотите обработать много сеансов?
В этом случае вы можете захотеть использовать массовые операции , например:
SELECT id BULK COLLECT INTO col_sessions_id from SESSIONS WHERE ...
FOR UPDATE
, а затем
FORALL i IN col_sessions_id.first .. col_sessions_id.last
UPDATE SESSIONS SET ... WHERE ID = col_sessions_id(i)
Когда вы используете ДЛЯ ОБНОВЛЕНИЯ без квалификаторов, вы можете получить зависание .
Без NOWAIT или явное WAIT предложение будет ждать, пока не будет получена блокировка.
Вы действительно этого хотите? Может быть, вам нужно вместо этого использовать NOWAIT или SKIP LOCKED вместо этого?
В высоконагруженных производственных случаях этот шаблон очень часто используется.
Конечно, вы должны обрабатывать исключения и корректировать ваши business logi c.
Использовать прямой доступ к строкам после выбора ДЛЯ ОБНОВЛЕНИЯ .
Помните, что вы можете выбрать ROWID вместо ID и использовать их позже для обновления.
Если вы передадите ROWID в предложение WHERE, то Oracle сделает вас DML очень быстрым, даже не используя индексы .
См. Простой ROWID пример здесь .