Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие.doc
Скачиваний:
57
Добавлен:
14.05.2015
Размер:
1.51 Mб
Скачать

4. Примеры использования курсоров

Пример 1: Циклический просмотр таблицы publishers:

/* Подавляем отображение значения счетчика строк */

SET NOCOUNT ON

/* Обновляем курсор, содержащей столбцы pub_id и pub_name*/

DECLARE pub_crsr CURSOR

FOR

SELECT pub_id, pub_name

FROM publishers

/*Отрываем курсор*/

open pub_crsr

/*Выбираем 1-ю строку из курсора*/

FETCH NEXT FROM pub_crsr

/*Выбираем в цикле строки курсора*/

WHILE @@FETCH_Status=0

Begin

/*Выбираем следующую строку*/

FETCH NEXT FROM pub_crsr

End

/*Закрываем курсор*/

DEALLOCATE pub_crsr

GO

При каждом выполнении оператора FETCH происходит обращение к глобальной переменной @@FETCH_Status. Когда указатель записей достигнет конца результирующего набора, пе­ременная @@FETCH_Status станет равной –1 и цикл завер­шится.

Результат будет включать все значения двух столб­цов таблицы publishers.

Пример 2. Позиционное обновление – выполняется про­смотр каждой строки в таблице publishers. Если содержимое столбца pub_id равно ‘1555’, то значение столбца pub_name мо­дернизируется и устанавливается равным ‘Cпутник’

/*Подавляем отображение счетчика строк*/

SET NOCOUNT ON

/*Объявляем переменные*/

DECLARE @pub_id CHAR (4), @pub_name varchar(40)

/*Объявляем курсор, который будет содержать*/

/*столбцы pub_id и pub_name из таблицы publishers*/

/*ПРИМЕЧАНИЕ: директива FOR UPDATE разрешает*/

/*выполнять позиционные обновления данных кур­сора*/

DECLARE pub_crsr CURSOR

FOR

SELECT pub_id, pub_name

FROM publishers

FOR UPDATE OF pub_id, pub_name

/*Открываем курсор*/

OPEN pub_crsr

/*Получаем первую строку из курсора*/

FETCH NEXT FROM pub_crsr INTO @pub_id, @pub_name

/*Проходим в цикле по строкам курсора*/

WHILE @@FETCH_Status=0

BEGIN

IF @pub_id=’1555’

UPDATE publishers

SET pub_name=’Cпутник’

WHERE CURRENT OF pub_crsr

/*Получаем следующую строку*/

FETCH NEXT FROM pub_crsr INTO @pub_ud,@pub_name

END

/*Закрываем курсор*/

DEALLOCATE pub_crsr

GO

ТемаIx. Использование хранимых процедур

1. Достоинства и недостатки хранимых процедур

Хранимые процедуры представляют собой набор заранее скомпилированных операторов SQL и операторов управления программой. Хранимые процедуры расширяют стандартные воз­можности SQL, позволяя использовать параметры, операторы принятия решений и объявления переменных, а также возвращать информацию. Хранимую процедуру можно представить себе в виде программы или функции, которая хранится в SQL Server как объект базы данных. Хранимая процедура выполняется не по инициативе клиента, а по инициативе SQL Server. Хранимая про­цедура может иметь вид простейшего оператора SQL:

SELECT * FROM authors

Хранимая процедура может также включать ряд сложных операторов SQL и операторов управления программой, которые позволяют применить к таблицам баз данных сложную логику приложения или выполнить некоторую задачу.

Достоинства хранимых процедур:

  • позволяют осуществить сложные операции, кото­рые нельзя выполнить с использованием обычных операторов SQL;

  • обеспечивают значительный выигрыш в быстродейст­вии по сравнению со стандартными операторами SQL, так как опе­раторы хранимой процедуры заранее скомпилированы. После первого выполнения хранимой процедуры создается план её вы­полнения, который сохраняется в процедурном кэше, и поэтому все последующие выполнения хранимой процедуры протекают намного быстрее по сравнению с эквивалентными операторами SQL;

  • хранимые процедуры можно использовать в каче­стве механизма защиты. Например, можно отменить всеобщий доступ к базовым таблицам и создать хранимые процедуры, представляя пользователям только права на выполнение соответ­ствующих хранимых процедур. Использование такого механизма защиты – это единственный способ не допустить случайной моди­фикации таблицы со стороны пользователей, использующих MS-Query и MS Access. Администратор БД может предоставить доступ к таблицам только по чтению, а затем для выполнения модифика­ций типа UPDATE и DELETE создать хранимые процедуры.

Недостатки хранимых процедур:

  • с помощью хранимых процедур трудно реализовать сложную логику приложения, так как в Transact-SQL не преду­смотрены массивы и возможность создания функций, определён­ных пользователем. Редактор хранимых процедур не такой высо­коорганизованный и многофункциональный, как редактор про­граммного кода в VB. Он больше напоминает редактор Notepad, при возникновении синтаксических ошибок трудно расшифровать сообщения об ошибках;

  • могут возникнуть трудности при эксплуатации хра­нимых процедур. Если их использовать для проектов или специ­альных административных задач, то их количество может быть весьма большим. В SQL Server не предусмотрено средств для за­поминания, что делает каждая процедура, и в каких процедурах используются другие хранимые процедуры, – поддержка храни­мых процедур требует дополнительных усилий