Прокручиваемые курсорыScrollable Cursors

В современных экранных приложениях пользователь прокручивается назад и вперед по данным.In modern screen-based applications, the user scrolls backward and forward through the data. Для таких приложений возврат к ранее полученной строке является проблемой.For such applications, returning to a previously fetched row is a problem. Одна из возможных вариантов — закрыть и снова открыть курсор, а затем выбрать строки, пока курсор не достигнет нужной строки.One possibility is to close and reopen the cursor and then fetch rows until the cursor reaches the required row. Другой возможностью является чтение результирующего набора, кэширование его на локальном компьютере и реализация прокрутки в приложении.Another possibility is to read the result set, cache it locally, and implement scrolling in the application. Обе возможности хорошо работают только с мелкими результирующими наборами, а вторая возможность — сложно реализовать.Both possibilities work well only with small result sets, and the latter possibility is difficult to implement. Лучшим решением является использование прокручиваемого курсора, который может перемещаться назад и вперед в результирующем наборе.A better solution is to use a scrollable cursor, which can move backward and forward in the result set.

Прокручиваемый курсор обычно используется в современных экранных приложениях, в которых пользователь прокручивается назад и вперед по данным.A scrollable cursor is commonly used in modern screen-based applications in which the user scrolls back and forth through the data. Однако приложения должны использовать прокручиваемые курсоры только в том случае, если курсоры не будут выполнять задание, так как прокручиваемые курсоры обычно более дороги, чем однонаправленные курсоры.However, applications should use scrollable cursors only when forward-only cursors will not do the job, as scrollable cursors are generally more expensive than forward-only cursors.

Возможность перемещения назад вызывает вопрос, неприменимый к однонаправленным курсорам: должен ли прокручиваемый курсор обнаруживать изменения, внесенные в строки, которые были ранее получены?The ability to move backward raises a question not applicable to forward-only cursors: Should a scrollable cursor detect changes made to rows previously fetched? То есть должен ли он обнаруживать обновленные, удаленные и вновь вставленные строки?That is, should it detect updated, deleted, and newly inserted rows?

Этот вопрос возникает из-за того, что определение результирующего набора — набор строк, соответствующих определенным критериям, не находится в состоянии, когда строки проверяются на соответствие этим критериям, и не проверяет, должны ли строки содержать одни и те же данные при каждой их выборки.This question arises because the definition of a result set - the set of rows that matches certain criteria - does not state when rows are checked to see whether they match that criteria, nor does it state whether rows must contain the same data each time they are fetched. Первое появление позволяет прокручивать курсоры, чтобы определить, были ли вставлены или удалены строки, а вторая позволяет им обнаруживать обновленные данные.The former omission makes it possible for scrollable cursors to detect whether rows have been inserted or deleted, while the latter makes it possible for them to detect updated data.

Возможность обнаружения изменений иногда бывает полезной, иногда это не так.The ability to detect changes is sometimes useful, sometimes not. Например, приложению учета требуется курсор, который игнорирует все изменения. балансирующие книги невозможны, если курсор отображает последние изменения.For example, an accounting application needs a cursor that ignores all changes; balancing books is impossible if the cursor shows the latest changes. С другой стороны, для системы резервирования авиакомпании необходим курсор, показывающий последние изменения данных. без такого курсора он должен постоянно создавать запрос к базе данных, чтобы продемонстрировать актуальную доступность рейса.On the other hand, an airline reservation system needs a cursor that shows the latest changes to the data; without such a cursor, it must continually requery the database to show the most up-to-date flight availability.

Чтобы охватить потребности различных приложений, ODBC определяет четыре различных типа прокручиваемых курсоров.To cover the needs of different applications, ODBC defines four different types of scrollable cursors. Эти курсоры зависят как от расходов, так и от их возможности обнаруживать изменения в результирующем наборе.These cursors vary both in expense and in their ability to detect changes to the result set. Обратите внимание, что если прокручиваемый курсор может обнаруживать изменения в строках, он может обнаружить их только при попытке повторной выборки этих строк. Источник данных не может уведомлять курсор об изменениях в выбранных строках.Note that if a scrollable cursor can detect changes to rows, it can only detect them when it attempts to refetch those rows; there is no way for the data source to notify the cursor of changes to the currently fetched rows. Обратите внимание, что видимость изменений также контролируется уровнем изоляции транзакций. Дополнительные сведения см. в разделе изоляция транзакций.Note as well that visibility of changes is also controlled by the transaction isolation level; for more information, see Transaction Isolation.

Этот раздел содержит следующие подразделы.This section contains the following topics.