Лекция 4 Курсоры
.docx
Курсоры достаточно тяжелый, с точки зрения СУБД, инструмент. Скорость с использованием курсоров уменьшается. Курсоры "жрут" оперативную память. Курсор - механизм, который предоставляется как сервис СУБД.
Курсоры позволяют каждой единицы набора данных применять свой код. Информация в курсор попадает с помощью операции select. Курсоры высшего уровня вызывают проблему блокировки строк, это связанно с тем, что курсор позволяет обновлять указатель на данные. Не всегда можно использовать select вместо курсора:
-
Не везде можно объявить select;
-
У курсора всегда есть собственное персональное имя;
-
В курсоре каждый элемент можно обрабатывать отдельно
У курсора есть собственный жизненный цикл:
-
Объявление - курс получает собственное имя и параметры, декларируется операция выборки, на основании которой будет жить курсор;
-
Открытие - выполнение select, который формирует курсор, или выполнение курсора, можно обращаться по имени, блокируются строки, которые участвовали в операции select (все остальные участники сервера будут ждать, когда мы разблокируем все строки);
-
Использование - получение элементов из курсора по принципу очереди или стека;
-
Закрытие - снятие всех блокировок, курсор остается физически, но к нему нельзя заново обратиться;
-
Высвобождение памяти - память принудительно отдается ОС для использования, может быть явным или неявным.
Курс объявляется как переменная:
Declare <name> cursor
for <select ...>
Declare <name> cursor
set <name> for декларируется как переменная, для него не нужно высвобождаем память и тд
Студент |
Id |
Фамилия |
Оценка |
1. Declare c1 cursor for select id from студент where оценка=5
2. Open c1
2.1. Declare @id int
3. Fetch next from c1 into @id - операция выборки из курсора каждый по следующий элемент (next в отличие от стальных направлений работает всегда)
4. Close c1
5. Deallocate c1
3'. Fetch next from c1 into @id while @@fetch_status=0
begin
Print @id
Fetch next from c1 into @@id
End
fetch_status==0 все хорошо
fetch_status==-1 за границы
fetch_status==-2 данные, на которые ссылается курсор, отсутствуют
Declare c1 cursor
1. local или global
Global - глобальные курсоры, живут, пока их явно не уничтожат или не закроется соединение, которое из породило.
Local - виден только внутри контексте, где был создан и уничтожается, после выхода из области видимости.
2. forward_only или scroll
Курсор forward_only работает быстрее
3. Типы курсора:
Static - значение по умолчанию, не блокирует строки. Заменяем временными таблицами
Keyset - записываются ссылки на те фактические места, где лежат данные, работает медленнее, чем static, главный минус - мы должны иметь абсолютно уникальные строки, иначе система сама переведет курсор в static
Dynamic - очень похож на keyset, используется только на небольших таблицах
Fast_forward формируется только для прохода в одну сторону, при этом позволяет вносить изменения, формируется на основании ключей и данных, одноразовый - нельзя заново открыть
Преобразование курсоров sp_ describe_cursor выводит список активных опции курсора
4. Read_only не будем обновлять данные, на которые ссылается курсор, следовательно, не будет блокировок, значение по умолчанию
Scroll_locks все данные должны быть заблокированы до особых распоряжений
Optimistic для порождения грязных данных
Операция обновления update <name table> set столбец = значение where current of курсор
@@fetch_rows хранит количество строк в курсоре
Направление курсора: next, prior, first, last, absolute,
relative - смещение на несколько единиц