2012-04-10 2 views
2

Я работаю с курсорами на данный момент, и это становится беспорядочным для меня, надеюсь, вы можете выделить некоторые вопросы для меня.Создание курсора, копируются ли данные?

Я проверил оракул документации о курсорах, но я не могу найти:

При открытии курсора, является локальной копией результата, созданным на памяти?

  • Да: Действительно ли это имеет смысл, если у меня есть таблица с большим количеством данных? Я думаю, что это было бы не очень эффективно, не так ли ?.
  • No: Все данные заблокированы для других процессов?

    1. ДА : Что делать, если я делаю по-настоящему тяжелый процесс для каждой строки, то данные будут Unavaliable так долго ...

    2. NO : Что произойдет, если другой процесс изменения данные, которые я сейчас использую с помощью курсора, или если он добавляет новые строки, будет ли он обновляться для курсора?

спасибо.

+0

Курсор, хотя иногда единственный способ, которым вы можете пойти, всегда неэффективен. Есть несколько разновидностей курсора от прямого чтения, чтобы полностью синхронизироваться, чем больше вам нужно, тем больше он стоит. Всегда лучше приложить усилия к тому, чтобы не понадобиться курсор (за исключением одной задачи администратора), чем пытаться сделать лучший курсор, который вы можете. –

+0

@TonyHopkinson - как вы получаете доступ к данным в реляционной базе данных без использования курсора? –

+0

Выбор оператора ... Зависит от того, что вы делаете с курсором, но многие проблемы могут быть решены с помощью изменений схемы, конечно, это не всегда вариант. –

ответ

3

Возможно, вы захотите прочитать раздел о Data Concurrency and Consistency в Concepts Guide.

Ответы на конкретные вопросы:

При открытии курсора, является локальная копия результата создается на памяти?

Нет, однако через Оракул «многовариантность согласованность чтения» (см ссылка выше) строку, выбранный курсором все будет соответствовать моменту времени, при котором был открыт курсор - то есть каждая строка, когда извлекается будет строка, которая существовала, когда курсор был открыт и все еще имеет одинаковые значения (даже если другой сеанс мог обновить или даже удалить его в среднее время).

Нет: все данные заблокированы для других процессов? не

Нет

NO: Что произойдет, если другой процесс изменения данных я в настоящее время используется с курсором или, если он добавляет новые строки, будет ли обновляться для курсора?

Ваш курсор не будет видеть эти изменения, он будет продолжать работать со строками, как они существовали при открытии курсора.

Руководство Концепции объясняет это в деталях, но суть, как она работает следующим образом:

  • Oracle поддерживает то, что называется System Change Number (SCN), который постоянно увеличивается.
  • Когда ваш курсор открывается, он отмечает текущее значение SCN.
  • По мере того, как курсор извлекает строки, он смотрит на отмеченный на них символ SCN. Если этот SCN тот же или ниже начального SCN курсора, данные обновляются и используются. Однако, если SCN строки больше, чем указано курсором, это означает, что другой сеанс изменил строку (и совершил изменение). В этом случае Oracle просматривает сегменты отката для старой версии строки и вместо этого использует это. Если запрос длится долгое время, возможно, что старая версия была перезаписана в сегментах отката. В этом случае запрос выходит из строя с ошибкой ORA-01555.

При необходимости вы можете изменить это поведение по умолчанию. Например, если это важно, что никакая другая сессия не изменяет строки, которые вы запрашиваете во время выполнения вашего курсора, то вы можете использовать пункт FOR UPDATE для блокировки строк:

CURSOR c IS SELECT sal FROM emp FOR UPDATE OF sal; 

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

Смежные вопросы