|
Программирование >> Реализация баз данных
Зашггие 3 Извлечение данных с помощыо курсоров 217 устанавливают результирующего набора и курсора, управляемого набором ключей, а затем с описателя этого оператора исполнять операторы DECLARE CURSOR и OPEN, вызывающие курсор INSENSITIVE. Недостатком серверных курсоров можно считать, что они поддерживают не все операторы Серверные курсоры не поддерживают операторы которые генерируют несколько результирующих наборов; поэтому их нельзя использовать при исполнении приложением хранимой процедуры или пакета, где имеется несколько операторов SELECT. Серверные курсоры также не поддерживают операторы SQL с ми словами COMPUTE. COMPUTE liV. FOR BROWSE или INTO. Серверные курсоры Transact-SQL Серверные курсоры Transact-SQL основаны на операторе DECLARE CURSOR и используются в основном ридх Transact-SQL, хранимых процедурах и триггерах. Курсоры Transact-SQL реализованы на сервере и управляются операторами Transact-SQL, которые посылаются с клиента на сервер. Они также содержатся в пакетах, хранимых процедурах и триггерах. При работе с курсорами ct-SQL для объявления, заполнения и извлечения данных используется следующий набор операторов Transact-SQL: для объявления курсора используется оператор DECLARE CURSOR. При объявлении курсора следует задать оператор SELECT, который сгенерирует результирующий набор курсора; для заполнения курсора используется оператор OPEN. Он исполняет оператор SELECT, встроенн1й в оператор DECLARE CURSOR; для извлечения отдельных строк из результирующего набора предназначен оператор FETCH. Как правило, оператор FETCH исполняется многократно (по крайней мере по разу для каждой строки результирующего набора); где уместно, можно воспользоваться операторами №АТЕ или DELETE для модификации строки. Этот этап не обязателен; для закрытия курсора применяется оператор CLOSE. Этот процесс завершает активную операцию с курсором и освобождает некоторые ресурсы результирующий набор курсора и его блокировки для текущей строки). Курсор все равно остается объявленным, поэтому его можно повторно открыть посредством оператора OPEN; оператор DEALLOCATE удаляет из текущего сеанса ссылку на курсор. Этот процесс полностью все ресурсы, выделенные для курсора (в том числе и имя курсора). После освобождения курсора возможно его повторное создание с помощью оператора DECLARE. Следующие операторы Transact-SQL иллюстрируют способ объявления и заполнения курсора, извлечения данных из результирующего набора и их а также за- крытия и освобождения курсора: /* Обызляем курсор sCursoг ываем с ним оператор SELECT. */ USE Pubs DECLARE AuthorsCursor CURSOR FOR SELECT * FROM Authors ORDER EY Au lna(ne /* Заполняем курсор AuthorsCursor ирующим набором оператора SELECT. */ OPLN AuthorsCursor 28 Управление ание данными Глава 7 /* Извлекаем первую строку результирующего набора, */ FETCH NEXT FROM AuthorsCursor /. Обновляем номер телефона ченной строке. */ UPDATE Authors SET Phone = 415 658-9932 WHERE CURRENT OF AuthorsCursor . - /* Закрываем курсор Cursor. */ CLOSE AuthorsCursor .. . ч /* Освобождаем курсор AuthorsCursor, */ DEALLOCATE AuthorsCursor Сс1лки на курсоры Transact-SQL На имена и переменные курсоров ct-SQL разрешается сс1латься только операторам Transact-SQL, но не функция.м API OLE DB, ODBC, ADO и DB-LiPrary. Приложения. которые используют эти API и в обработке курсоров, использовать встроенную поддержку курсоров в API баз данных, вместо курсоров Transact-SQL. Курсоры Transact-SQL используют в приложениях с помощью оператора FETCH, привязывая каждый столбец, который > - Г этот оператор, к переменной в программе. Однако оператор Transact-SQL FETCH не поддерживает поэтому это наименее эффективный метод возврата приложению: построчная выборка требует много- кратных обращений к серверу. Более эффективный способ - использование встроенной функциональности курсоров из API баз данных, которая поддерживает Курсоры Transact-SQL чрезвычайно эффективны в составе хранимых процедур и триг-Все операторы в них компилируются на сервере в единый план исполнения, кроме того, отсутствует сетевой трафик, связанный с выборкой строк. Серверные курсоры API Курсоры этого типа реализованы на сервере и управляются курсорными API. Серверные курсоры API поддерживамто! API OLE DB, ODBC и DB-Libran,. Каждый раз, когда клиентское приложение вызывает функцию API для управления курсорами, компонент доступа SQL Server OLE DB, драйвер ODBC или DLL DB-Library передает на сервер запрос на выполнение некоторого над серверным курсором API. Примечание Хотя синтаксис курсороР! и курсоров Transact-SQL отличается, в обшем для работы с этими курсорами необходимо выполнить одинаковые процедуры; объявить курсор, открыть его, далее извлечь из него данные, затем закрыть и освободить курсор. API OLE DB, ODBC, ADO и DB-Library поддерживают привязку курсоров к результи-Р:лошим наборам операторов SQL. Коипонентдоступа SQL Server OLE DB, драйвер ODBC или DLL DB-Library реализуют эту с помощью серверных курсоров API. При использовании серверного курсора API в OLE DB, ODBC или ADO с помощью функций и методов API выполняются следующие действия: открытие соединения; установка атрибутов, определяющих характеристики курсора, для которого APIaBTO-матически устанавливает соответствие с каждым результирующим набором; исполнение одного или нескольких операторов Transact-SQL; выборка строк из результирующих наборов щью функций и методов API. В для работы с серверным курсором API используется функ- ции из библиотеки DB-Library Cursor Library. Если для атрибутов курсора API установлены значения по умолчанию, то компонент доступа OLE DB и драйвер ODBC SQL Server используют заданные но умолчанию резуль-TnpyiouLitt наборы. Хотя формально API выполняет запрос курсора, характеристики курсора по умолчанию соответствуют поведению результирующего набора по Поэтому компонент доступа OLE DB и драйвер ODBC реализуют опции курсора по умолчанию с помощью результирующего набора, заданного по умолчанию. Это наиболее эффективный метод получения данных с сервера. При использовании наборов по умолчанию приложение может исполнить любой оператор или пакет, но ем mjcho иметь только один необработанный оператор. Другими словами, прежде чем перейти к исполнению следующего оператора из соединения, приложение должно обработать или отменить все резу.гьтирующие наборы, которые вернул предыдущий оператор Если для атрибутов курсора API установлены значения, отличные от заданных по умолчанию, то компонент доступа OLE DB и драйвер ODBC SQL Server используют серверные курсоры API вместо результирующих наборов по умолчанию. Каждый вызов API, осуществляющей выборку строк, генерирует обращение к серверу для выборки строк из серверного курсора API. Приложения DB-Library запрашивают курсоры с помощью функций библиотеки DB-Library Cursor Library. Если параметр DBCLiENTCURSORne установлен, то функции DB-Library Cursor Library применяют курсоры API аналогично компоненту досту- па SQL Server OLE DB и драйверу ODBC. Ограничения серверных курсоров API При использовании серверных курсоров API приложение не может исполнить следующие операторы: операторы Transact-SQL, которые SQL Server не поддерживает в серверных курсорах; пакеты и хранимые процедуры, которые возвращают несколько ируюш;их наборов; операторы SELECT с конструкциями COMPUTE, COMPUTE BY, FOR BROWSE или INTO; оператор EXECUTE щийся нмную хранимую процедуру. Клиентские курсоры Клиентские курсоры реализованы средствами драйвера SQL Server ODBC, библиотек DB- Library и API ADO. Клиентские курсоры кэшируют все строки клиентского результирующего набора. При каждом вызове клиентским приложением функции API для управления курсором драйвер SQL Server ODBC, библиотека DB-Library или API ADO выполняет действия с использованием курсора над строками результирующего набора, кэшированными на клиенте. В клиентском курсоре с помощью результирующего набора по умолчанию кэшируется весь результирующий набор, а все операции с использованием курсора выполняются над кэшированными на клиенте записями. При этом не применяются никакие функции поддержки серверных курсоров SQL Server 2000. Клиентские курсоры поддерживают только однонаправленные и статические курсоры, но не динамические и не управляемые набором ключей курсоры.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |