Обработка результатов запросов. Подпрограммы в Transact-SQL (Лабораторная работа № 4), страница 3

                       return

           end

Особенности этой модификации команды:

·  возвращаемый результат функции – локальная переменная типа table, указанная в секции returns;

·  для возвращаемой таблицы явно определяется набор столбцов по аналогии с тем, как это делается в команде createtable (здесь же могут создаваться ограничения целостности табличного уровня);

·  после команды return в теле функции возвращаемое значение не указывается.

Изменение кода функций выполняется командой alterfunction. Опять-таки, в Transact-SQL имеются три разновидности этой команды для каждого типа функций. Синтаксически они напоминают соответствующие разновидности createfunction, но вместо первого слова create ставится alter и указывается имя уже существующей функции.

За удаление функций отвечает команда dropfunction. У нее всего одна разновидность в Transact-SQL, поскольку единственный ее параметр – имя функции или список имен функций.

2.2. Обработка результатов запросов. Курсоры

2.2.1. Понятие курсора

СУБД в ответ на пользовательский запрос может выдавать клиентскому приложению или процедуре большие наборы строк. Однако для обработки результатов запроса клиентским программам, равно как и самому серверу, часто не требуется весь набор сразу. Во многих случаях необходима построчная обработка данных: в каждый момент времени нужна только одна строка из всего набора.

В СУБД Microsoft SQL Server имеется механизм, позволяющий SQL-клиенту получать результат запроса отдельными порциями и обращаться к отдельной строке выборки, - курсор. На логическом уровне курсор – это своего рода указатель (не тождественный указателю в C или Pascal!) на текущую обрабатываемую строку набора. Перемещая курсор, пользователь получает доступ к любой строке выборки.

2.2.2. Использование курсоров

Весь процесс работы с курсором любого типа можно разбить на пять этапов:

1.  Объявление курсора. Данный этап можно сравнить с объявлением переменной в любом языке программирования высокого уровня. Здесь указывается имя и тип курсора, а также – в обязательном порядке! – прописывается запрос select, результаты которого курсор будет обрабатывать в дальнейшем. Каждый курсор связывается только с одним select-запросом.

2.  Открытие курсора. На этом этапе происходит выполнение запроса select, закрепленного за данным курсором, и формирование результирующего набора строк.

3.  Обработка данных при помощи курсора. После того, как курсор открыт, пользователь может обращаться к строкам результирующего набора. В некоторых случаях разрешается не только считывание, но и изменение данных в наборе. Как правило, обработка данных производится циклически, и курсор в цикле перемещается от первой строки до последней.

4.  Закрытие курсора. Набор строк, полученный на этапе открытия, уничтожается. Закрытый курсор может быть повторно открыт: запрос select в этом случае выполняется заново.

5.  Удаление курсора. Подразумевает изъятие курсора  (как объекта) из оперативной памяти, после чего становится невозможным его дальнейшее использование. Необходимо обязательно закрывать курсор перед удалением.

2.2.3. Классификация курсоров

Курсоры Microsoft SQL Server классифицируются тремя способами.

По месту хранения и принципам работы курсоры в SQL Server подразделяются на:

·  курсоры Transact-SQL, создаваемые на серверной стороне СУБД с помощью команд языка Transact-SQL;

·  курсоры API сервера, используемые прикладными программами с различными механизмами доступа к данным (ODBC, OLE DB, DB Library и др.); такие курсоры хранятся на сервере, а работа с ними выполняется клиентской стороной (клиентским приложением) средствами соответствующего API;