Синтаксис цикла 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.
< Предыдущая | Следующая > |
---|