Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекция 4 Курсоры

.docx
Скачиваний:
51
Добавлен:
25.02.2015
Размер:
488.25 Кб
Скачать

Курсоры достаточно тяжелый, с точки зрения СУБД, инструмент. Скорость с использованием курсоров уменьшается. Курсоры "жрут" оперативную память. Курсор - механизм, который предоставляется как сервис СУБД.

Курсоры позволяют каждой единицы набора данных применять свой код. Информация в курсор попадает с помощью операции select. Курсоры высшего уровня вызывают проблему блокировки строк, это связанно с тем, что курсор позволяет обновлять указатель на данные. Не всегда можно использовать select вместо курсора:

  1. Не везде можно объявить select;

  2. У курсора всегда есть собственное персональное имя;

  3. В курсоре каждый элемент можно обрабатывать отдельно

У курсора есть собственный жизненный цикл:

  1. Объявление - курс получает собственное имя и параметры, декларируется операция выборки, на основании которой будет жить курсор;

  2. Открытие - выполнение select, который формирует курсор, или выполнение курсора, можно обращаться по имени, блокируются строки, которые участвовали в операции select (все остальные участники сервера будут ждать, когда мы разблокируем все строки);

  3. Использование - получение элементов из курсора по принципу очереди или стека;

  4. Закрытие - снятие всех блокировок, курсор остается физически, но к нему нельзя заново обратиться;

  5. Высвобождение памяти - память принудительно отдается ОС для использования, может быть явным или неявным.

Курс объявляется как переменная:

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 - смещение на несколько единиц

Соседние файлы в предмете Проектирование баз данных