- •42. Понятие индекса.
- •43. Методы организации индекса:
- •44. Плотный индекс
- •45. Неплотный индекс
- •46. Индекс b-дерево.
- •47. Инвертированные списки.
- •48. Понятие курсора. Типы курсоров.
- •49. Управление курсорами на языке t-sql. Объявление курсора
- •51. Команды управления вычислительным процессом
- •50. Язык программирования бизнес-логики сервера бд.
47. Инвертированные списки.
Для обеспечения ускорения доступа по вторичным ключам используются структуры, называемые инвертированными списками, которые послужили основой организации индексных файлов для доступа по вторичным ключам. Инвертированный список - это двухуровневая индексная структура. Здесь на первом уровне находится файл, в котором упорядочено расположены значения вторичных ключей. Каждая запись с вторичным ключом имеет ссылку на номер блока в цепочке блоков, содержащих номера записей с данным значением вторичного ключа. На 2 уровне находится цепочка блоков, содержащих номера записей, имеющих одно и то же значение вторичного ключа. При этом блоки 2 уровня упорядочены по значению вторичного ключа. И наконец, на 3 уровне находится собственно основной файл. Механизм доступа к записям по вторичному ключу при подобной организации записей весьма прост. На первом шаге ищем в области 1 уровне заданное значение вторичного ключа, а затем по ссылке считываем блоки 2 уровня, содержащие номера записей с заданным значениями вторичного ключа, а далее уже прямым доступом загружаем в рабочую область пользователя содержимое всех записей, содержащих заданное значение вторичного ключа.
48. Понятие курсора. Типы курсоров.
Курсор в SQL – это область в памяти базы данных, которая предназначена для хранения последнего оператора SQL. Если текущий оператор – запрос к базе данных, в памяти сохраняется и строка данных запроса, называемая текущим значением, или текущей строкой курсора. Указанная область в памяти поименована и доступна для прикладных программ.
Обычно курсоры используются для выбора из базы данных некоторого подмножества хранимой в ней информации.
Категории курсоров:
Последовательные (позволяют выбирать данные только в одном направлении – от начала к концу)
Прокручиваемые (предоставляют большую свободу действий – допускается перемещение в обоих направлениях и переход к произвольной строке результирующего набора курсора)
SQL Server поддерживает курсоры:
Статические (В схеме со статическим курсором информация читается из базы данных один раз и хранится в виде моментального снимка (по состоянию на некоторый момент времени), поэтому изменения, внесенные в базу данных другим пользователем, не видны)
Динамические (Динамический курсор поддерживает данные в "живом" состоянии, но это требует затрат сетевых и программных ресурсов)
Последовательные (Последовательные курсоры не разрешают выполнять выборку данных в обратном направлении. Пользователь может выбирать строки только от начала к концу курсора)
управляемые набором ключей (Записи идентифицируются на момент выборки, и тем самым отслеживаются изменения)
49. Управление курсорами на языке t-sql. Объявление курсора
В стандарте SQL для создания курсора предусмотрена следующая команда:
DECLARE имя_курсора
[INSENSITIVE] [SCROLL] CURSOR
FOR SELECT_оператор
[FOR { READ_ONLY | UPDATE
[OF имя_столбца[,...n]]}]
В среде MS SQL Server принят следующий синтаксис команды создания курсора:
DECLARE имя_курсора CURSOR [LOCAL | GLOBAL]
[FORWARD_ONLY | SCROLL]
[STATIC | KEYSET | DYNAMIC | FAST_FORWAR]
[READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]
[TYPE_WARNING]
FOR SELECT_оператор
[FOR UPDATE [OF имя_столбца[,...n]]]
Открытие курсора
Для открытия курсора и наполнения его данными из указанного при создании курсора запроса SELECT используется следующая команда:
OPEN { { [GLOBAL] имя_курсора }
|@имя_переменной_курсора }
Выборка данных из курсора
Сразу после открытия курсора можно выбрать его содержимое (результат выполнения соответствующего запроса) посредством следующей команды:
FETCH [ [NEXT | PRIOR | FIRST | LAST
| ABSOLUTE {номер_строки
| @переменная_номера_строки}
| RELATIVE {номер_строки | @переменная_номера_строки} ]
FROM ] { { [GLOBAL ] имя_курсора } | @имя_переменной_курсора }
[INTO @имя_переменной [,...n]]
Изменение и удаление данных
UPDATE имя_таблицы SET {имя_столбца = {DEFAULT | NULL | выражение} } [,...n]
WHERE CURRENT OF { { [GLOBAL] имя_курсора} |@имя_переменной курсора}
За одну операцию могут быть изменены несколько столбцов текущей строки курсора, но все они должны принадлежать одной таблице.
DELETE имя_таблицы
WHERE CURRENT OF { { [GLOBAL] имя_курсора} |@имя_переменной курсора}
Закрытие курсора
CLOSE {имя_курсора | @имя_переменной_курсора}
Освобождение курсора
DEALLOCATE { имя_курсора | @имя_переменной_курсора }
Для контроля достижения конца курсора рекомендуется применять функцию: @@FETCH_STATUS
Функция @@FETCH_STATUS возвращает:
0, если выборка завершилась успешно;
-1, если выборка завершилась неудачно вследствие попытки выборки строки, находящейся за пределами курсора;
-2, если выборка завершилась неудачно вследствие попытки обращения к удаленной или измененной строке.
