DeepEdit!

Программирование баз данных на Oracle, техническая документация, литература, статьи и публикации

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Неявные циклы FOR


Синтаксис цикла FOR можно сократить еще больше. Можно неявно объя­вить сам курсор, как показывает следующий пример:
Запрос содержится в скобках внутри самого оператора В данном случае запись v_StudentData и курсор объявляются неявно. Однако курсор не имеет имени.
NO_DATA_FOUND и %NOTFOUND
Исключительная ситуация NO DATA FOUND (данные не найдены) уста­навливается только для операторов SELECT...INTO, когда условию WHERE запроса не соответствует ни одна из строк. В этом случае атрибут %NOTFOUND принимает значение TRUE. Если нет соответствия строкам в условии WHERE оператора UPDATE или DELETE, SQL%NOTFOUND также принимает значение TRUE. Поэтому во всех циклах выборки, рас­смотренных выше, для определения условия выхода из цикла используется не исключительная ситуация NO_DATA_FOUND, а атрибут %NOTFOUND или % FOUND.
Курсоры SELECT FOR UPDATE
Очень часто при обработке данных в цикле выборки модифицируются строки, которые были считаны курсором. В PL/SQL для этого предлагает­ся удобное средство, состоящее из двух частей: конструкции FOR UPDATE (для обновления), указываемой в объявлении курсора, и конструкции WHERE CURRENT OF (где текущая строка ... ) в операторе UPDATE или DELETE.
FOR UPDATE
Конструкция FOR UPDATE является частью оператора SELECT. Ее разре­шается использовать в качестве последней конструкции оператора, после ORDER BY (если есть):
SELECT ... FROM ... FOR UPDATE [OF ссылка_на_столбец] [NOWAIT]
где ссылка_на_столбец — это столбец таблицы, для которой выполняется запрос. Можно также воспользоваться списком столбцов. Например, ниже приводится раздел объявлений, в котором описываются два курсо­ра. Это правильные формы курсора SELECT...FOR UPDATE.
Обычно при выполнении операции SELECT строки, к которым проис­ходит обращение, не блокируются. Это дает возможность другим сеансам, соединенным с базой данных, изменять выбираемые данные. Тем не менее результирующий набор данных остается согласованным. Во время откры­тия курсора, когда определяется активный набор, Oracle извлекает момен­тальный снимок (snapshot) таблицы. Все изменения, зафиксированные к этому моменту, отражаются в активном наборе. Все изменения, внесенные после этого момента, не отражаются, даже после их фиксации. Они будут отражены, если открыть курсор вновь, что приведет к повторному опреде­лению активного набора. Таков алгоритм согласованного чтения данных. Однако при использовании конструкции FOR UPDATE перед открытием курсора устанавливаются исключающие блокировки строк активного набо­ра. Эти блокировки предотвращают изменение строк активного набора другими сеансами до завершения транзакции.
Если другой сеанс уже блокировал строки активного набора, операция SELECT.,.FOR UPDATE будет ждать снятия этих блокировок неограни­ченное время. Можно воспользоваться параметром NOWAIT (без ожида­ния), тогда оператор OPEN сразу же вернет сообщение об ошибке, если строки блокированы другим сеансом:
В этом случае можно попытаться открыть курсор позже или изменить активный набор так, чтобы считывать неблокированные строки.
В        использовать синтаксис
J    SELECT...FROM...FOR UPDATE [OF ссылка_на_столбец[ [WAIT
где n — число секунд ожидания. Если строки не разблокируются в течение п секунд, возвращается ошибка ORA-54.

 









jAntivirus