Что такое курсор?
Операции в реляционной базе данных действуют на полном наборе строк. Набор строк, возвращаемых инструкцией SELECT, состоит из всех строк, удовлетворяющих условиям в предложении WHERE инструкции. Этот полный набор строк, возвращаемых инструкцией, называется результирующий набор. Приложения, особенно интерактивные и онлайн, не всегда могут эффективно работать со всем результирующим набором как единым целым. Эти приложения нуждаются в механизме работы с одной строкой или небольшим блоком строк за раз. Курсоры являются расширением для результирующих наборов, предоставляющим этот механизм.
Курсор реализуется библиотекой курсоров. Библиотека курсоров — это программное обеспечение, часто реализованное как часть системы базы данных или API доступа к данным, которое используется для управления атрибутами данных, возвращаемыми из источника данных (результирующий набор). К этим атрибутам относятся управление параллелизмом, позиция в результирующем наборе, количество возвращаемых строк и возможность перемещения вперед или назад (или оба) через результирующий набор (возможность прокрутки).
Курсор отслеживает позицию в результирующем наборе и позволяет выполнять несколько операций по строкам в этом наборе, при этом возвращаясь или не возвращаясь в исходную таблицу. Другими словами, курсоры концептуально возвращают результирующий набор на основе таблиц в базах данных. Курсор так называется, так как он указывает текущую позицию в результирующем наборе, так же как курсор на экране компьютера указывает текущее положение.
Важно ознакомиться с понятием курсоров, прежде чем перейти к изучению особенностей их использования в ADO.
С помощью курсоров можно:
Укажите расположение в определенных строках в результирующем наборе.
Извлеките одну строку или блок строк на основе текущей позиции результирующих наборов.
Измените данные в строках в текущей позиции в результирующем наборе.
Определите различные уровни конфиденциальности изменений данных, внесенных другими пользователями.
Например, рассмотрим приложение, которое отображает список доступных продуктов потенциальному покупателю. Покупатель прокручивает список, чтобы просмотреть сведения о продукте и стоимость, и, наконец, выбирает продукт для покупки. Для остальной части списка выполняется дополнительная прокрутка и выделение. С точки зрения покупателя, продукты отображаются по одному за раз, но приложение использует прокручиваемый курсор для пролистывания вверх и вниз через результирующий набор.
Курсоры можно использовать различными способами:
Без строк вообще.
С некоторыми или всеми строками в одной таблице.
С некоторыми или всеми строками из логически связанных таблиц.
Как доступный только для чтения или обновляемый на уровне курсора или поля.
Как режим только вперед или полностью прокручиваемый.
С набором ключей курсора, расположенным на сервере.
Чувствительны к изменениям базовой таблицы, вызванным другими приложениями (например, членством, сортировкой, вставками, обновлениями и удалениями).
Существующий на сервере или клиенте.
Курсоры только для чтения помогают пользователям просматривать результирующий набор, а курсоры чтения и записи могут реализовывать отдельные обновления строк. Сложные курсоры можно определить с помощью наборов ключей, которые указывают на строки базовой таблицы. Хотя некоторые курсоры доступны только для чтения и двигаются только вперед, другие могут перемещаться вперед и назад, предоставляя динамическое обновление результирующего набора на основе изменений, которые вносят другие приложения в базу данных.
Не все приложения должны использовать курсоры для доступа к данным или обновления. Некоторые запросы просто не требуют прямого обновления строк с помощью курсора. Курсоры следует использовать в последнюю очередь для извлечения данных, и при этом следует выбрать курсор с наименьшим воздействием. При создании результируемого набора с помощью хранимой процедуры результирующий набор не может обновляться с помощью методов редактирования курсора или обновления.
Конкурренция
В некоторых многопользовательских приложениях очень важно, чтобы данные, представленные пользователю, были максимально текущими. Классическим примером такой системы является система резервирования авиакомпаний, где многие пользователи могут претендовать на то же место на заданном рейсе (и, следовательно, одну запись). В таком случае дизайн приложения должен обрабатывать одновременные операции с одной записью.
В других приложениях одновременность не так важна. В таких случаях расходы, связанные с сохранением данных, не могут быть оправданы.
Позиция
Курсор также отслеживает текущую позицию в результирующем наборе. Подумайте о позиции курсора в качестве указателя на текущую запись, аналогично тому, как индекс массива указывает на значение в этом конкретном расположении в массиве.
Прокручиваемость
Тип курсора, используемого приложением, также влияет на возможность перемещения вперед и назад по строкам в результирующем наборе; Иногда это называется прокручиваемостью. Возможность перемещения вперед и назад через результирующий набор добавляет сложность курсора и, следовательно, дороже для реализации. По этой причине следует запрашивать курсор с этой функциональностью, только если это необходимо.