|
Программирование >> Программирование баз данных
INTO CursorTable FROM Orders WHERE OrderlD BETWEEN 10701 AND 10705 -- Объявление курсора DECLARE CursorTest CURSOR GLOBAL -- Параметр, позволяющий манипулировать курсором из кода, -- находящегося за пределами данного пакета SCROLL -- Параметр, позволяющий выполнять прокрутку назад и -- проверять результаты внесения изменений KEYSET TYPE WARNING FOR SELECT OrderlD, CustomerlD FROM CursorTable -- Объявления двух вспомогательных переменных DECLARE ©OrderlD int DECLARE ©CustomerlD varchar(5) -- Открытие курсора и получение первой строки OPEN CursorTest FETCH NEXT FROM CursorTest INTO ©OrderlD, ©CustomerlD -- Обработка данных в цикле WHILE @©FETCH STATUS=0 BEGIN PRINT CONVERT(varchar(5),©OrderlD) + + ©CustomerlD FETCH NEXT FROM CursorTest INTO ©OrderlD, ©CustomerlD -- Удаление ненужных объектов CLOSE CursorTest DEALLOCATE CursorTest DROP TABLE CursorTable Приведенный выше сценарий не имеет каких-либо существенных отличительных особенностей. Но сам автор рассматривает этот сценарий как написанный полностью заново, поскольку при его подготовке из исходного сценария был удален слишком большой объем кода, к тому же с момента рассмотрения исходного сценария прошло слишком много времени. Задачи создания таблицы и курсора осуществляются во многом аналогично тому, как в примере применения ключевого курсора, который рассматривался в одном из начальных разделов настоящей главы. Наиболее существенные модификации в этом сценарии заключаются в том, что изъяты фрагменты кода, которые не требуются для этой иллюстрации, а в объявлении курсора дополнительно указана опция TYPE WARNING. Вьшолнение рассматриваемого сценария приводит к получению следующих любопытных результатов: (5 row(s) affected) The created cursor is not of the requested type. 43661 442 43662 227 43663 510 43664 397 43665 146 Весь процесс вьшолнения завершается успешно, и даже обнаруживается сообщение, смысл которого сводится исключительно к предупреждению. Но результаты могут оказаться не такими, как следовало ожидать, с учетом того, что курсор был преобразован. Этот недостаток обусловлен тем, что СУБД передает предупреждающее сообщение, а не сообщение об ошие. С точки зрения эксплуатации программного обеспечения опция TYPE WARNING не позволяет кардинально реагировать на получение указанного сообщения, поэтому ее применение в производственной среде, вообще говоря, не имеет смысла. Тем не менее опция TYPE WARNING может оказаться весьма удобной в той ситуации, когда осуществляется попытка отладки курсора для определения того, почему он не действует в соответствии с ожиданиями. Раздел for < select> Раздел FOR <SELECT> объявления icypcopa представляет собой основу функционирования курсора. Этот раздел является обязательным, и без него невозможно обойтись даже в самом простом варианте синтаксического определения курсора, поскольку он содержит единственно возможную конструкцию, определяющую то, какие данные должны быть помещены в курсор. Как допустимые рассматриваются почти любые операторы SELECT, даже те, которые включают конструкцию ORDER BY. При этом, при условии, что оператор SELECT предоставляет единственный результирующий набор, никакие затруднения не возникают. Но такие варианты применения оператора SELECT, которые могут стать причиной нарушений в работе, связаны с применением любой из опций агрегирования наподобие CUBE или ROLLUP. Опция for update По умолчанию любой курсор, который можно считать обновляемым, должен быть полностью обновляемым; это означает, что если с помощью курсора можно вносить изменения в один столбец, то допускается внесение изменений в любой другой столбец. Опция FOR UPDATE <column 1 ist> позволяет указать, что модификации с помощью конкретного курсора подлежат только определенные столбцы. Если в объявление курсора включена эта опция, то допускается обновлять лишь те столбцы, которые указаны в списке столбцов <column list >. Любые другие столбцы, не упомянутые явно в этом списке, рассматриваются как предназначенные только для чтения. Перемещение по курсору: оператор fetch По мнению автора, в то время, когда впервые началась разработка синтаксиса курсоров SQL, было сразу же решено применить для обозначения операции выборки ключевое слово, отличное от SELECT. Это решение было обусловлено стремлением провести различие между операциями выборки с помощью курсора и средств языка SQL. Для этой цели было выбрано ключевое слово FETCH. И действительно, то английское слово ( доставить ), которое лежит в его основе, полностью выражает суть выборки данных с помощью курсора. Дело в том, что оператор FETCH позволяет передать СУБД SQL Ser\er информацию о том, какая именно строка должна быть получена с помощью курсора. Получив это указание, СУБД SQL Server приступает к его выполнению, отыскивает и возвращает искомую строку. Общее представление о том, как работает оператор FETCH, можно бьшо получить на примере изучения некоторых вариантов применения курсоров, описанных выше в настоящей главе, а в этом разделе указанный оператор рассматривается более подробно. До сих пор мы ознакомились далеко не со всеми опциями оператора FETCH. Дело в том, что в предьщущР1Х разделах рассматривались только три опции FETCH (NEXT, PREVIOUS и FIRST), которые являются наиболее важными. Поэтому нам осталось лишь немного дополнить это описание, чтобы иметь в своем распоряжении весь основной набор команд, предназначенньгх для перемещения в курсоре, а затем рассмотреть все остальные опции. Краткие сведения о каждой из команд перемещения в курсоре и об их назначении приведены в табл. 15.2. Безусловно, некоторые опции перемещения с помощью курсора, которые представлены в табл. 15.2, уже бьыи проиллюстрированы достаточно подробно в приведенных выше примерах применения курсоров. Другие опции перемещения действуют в основном подобным образом. Таблица 15.2. Опции перемещения в курсоре и их назначение Опция FETCH Описание next Опция next обоспечивает перемещение вперед точно на одну строку в резуль- тирующем наборе и является одной из наиболее широко используемых. В 90% случаев применения курсоров (или более) не потребуется иная опция, кроме этой. Об этом следует помнить, принимая решение о том, следует ли объявлять курсор как однонаправленный, forward only, или нет. Если при очередной попытке применения опции fetch next происходит выход за пределы последней строки, то системная переменная @@fetch status принимает значение -1 prior Опция prior, кэк МОЖНО было продположить, ПО своому нэзначению противо- положна опции next. Она обеспечивает перемещение назад точно на одну строку. Если попытка выполнения оператора fetch prior предпринимается в той ситуации, когда происходит обработка первой строки в результирующем наборе, то системная переменная @@fetch status принимает значение -1 в связи с выходом за пределы курсора first Название опции first, как и большинства других опций курсора, полностью соответствует ее назначению. После вызова на выполнение оператора fetch first происходит переход к первой строке в наборе записей. Единственная ситуация, в которой применение этой опции приводит к получению значения системной переменной @@fetch status, равного -1, соответствует пустому результирующему набору Опция last по своему назначению противоположна опции first, и при выполнении оператора fetch last происходит переход к последней строке в результирующем наборе. И в этом случае единственным вариантом, который приводит к получению значения -1 системной переменной @@fetch status, является применение пустого результирующего набора Опция absolute позволяет задать целочисленное значение, которое указывает, на какое количество строк с начала курсора должно быть выполнено перемещение. Если заданное значение является отрицательным, то оно обозначает количество строк с конца курсора. Следует отметить, что при работе с динамическими курсорами эта опция не поддерживается (поскольку принадлежность строк к курсору переопределяется после каждой выборки, невозможно определить, где физически находится строка, требуемая в данный момент). В некоторых клиентских объектных моделях доступа применение опции absolute равносильно перемещению к определенной абсолютной позиции relative Опция relative СЛуЖИТ СВООГО рОДЭ ДОПОЛНеНИеМ К ОПЦИИ absolute, НО в отличие от последней обеспечивает перемещение на указанное количество строк вперед или назад относительно текущей строки last absolute
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |