В указанные переменные будет помещен результат однострочного запроса, поэтому список переменных должен быть согласован как по порядку, так и по типу данных со списком возвращаемых атрибутов.
Для реализации многострочных запросов вводится новое понятие – курсора или указателя записей.
Курсор – это вид переменной, которая связана с запросом. Значением этой переменной может быть каждая строка, которая выводится при запросе. Курсор должен быть объявлен прежде, чем он будет использован. Для объявления курсора служит команда DECLARE CURSOR. Оператор определяет исполняемый запрос, задает имя курсора и связывает результаты запроса с заданным курсором.
WHERE STIP=30;
Этот запрос не будет выполнен немедленно, так как в данном случае представлено только его определение. Курсор напоминает представление, в котором определение содержит запрос, а содержательной частью является любой вывод запроса, и это происходит каждый раз, когда курсор становится открытым. Однако в отличие от базовых таблиц или представлений, строки курсора упорядочены и имеются первая, вторая и т.д., а также последняя строка.
Оператор OPENCURSOR дает команду СУБД выполнить описанный запрос, создать виртуальный набор строк, который соответствует заданному запросу. Оператор OPEN устанавливает курсор (указатель записей) перед первой строкой виртуального набора строк результата.
Итак, когда в программе необходимо выполнить запрос, то открывают курсор с помощью следующей команды:
Значения в курсор передаются именно тогда, когда выполняется приведенная выше команда.
После открытия указатель текущей строки установлен перед первой строкой курсора.
Команда FETCH перемещает указатель текущей строки в виртуальном наборе записей на следующую строку и присваивает базовым переменным значения столбцов, соответствующие текущей строке. В большинстве коммерческих СУБД оператор FETCHреализует более широкие функции перемещения, перемещая указатель на произвольную запись, на первую, последнюю и т.д.
Например:
EXEC SQL FETCH STIPKUR INTO : @NOM_ZACH, @SFAM, @STIP;
Эта конструкция присвоит значение из первой выбранной строки в переменные памяти. Следующая команда FETCH выведет очередной набор значений и.т.д. Как правило, команду FETCH помещают внутрь цикла так, чтобы, выбрав строку из курсора, можно было осуществить перемещение набора значений из этой строки в переменные, возвратиться обратно и переместить следующий набор значений в эти же переменные.
Оператору OPEN CURSOR должен соответствовать оператор CLOSE CURSOR. Оператор закрытия курсора закрывает временную таблицу созданную оператором открытия курсора и прекращает доступ прикладной программы к этому объекту.
Курсоры в прикладных программах часто используются для последовательного просмотра данных. Если курсор не связан с операцией группировки, то каждая строка курсора соответствует строго одной строке исходной таблицы, Курсор удобно использовать для корректировки данных. В стандарте определены операции модификации данных, связанных с курсором. Например, операция удаления строки, связанной с текущим указателем:
DELETE FROM <имя таблицы> WHERE CURRENT OF <имя курсора>
Если указанный курсор открыт, и установлен на некоторую строку, то данная строка удаляется. Для того чтобы прочитать следующую строку необходимо выполнить оператор FETCH NEXT.
Аналогично выполняется команда обновления. Для того чтобы можно было применять позиционные команды удаления и обновления, курсор должен удовлетворять определенным требованиям: запрос, связанный с курсором должен считывать данные только из одной таблицы; в запросе не должно быть предложения ORDER BY, для того чтобы сохранялось взаимно однозначное соответствие строк курсора и исходной таблицы; запрос не должен содержать предложения GROUP BY или HAVING.
Курсор представляет собой удобное средство для формирования бизнес - логики приложений, но следует иметь в виду, что если открывается курсор с возможностью модификации, то СУБД блокирует все строки базовой таблицы, вошедшей в курсор, и тем самым блокируется работа других пользователей с данной таблицей.
В развитых моделях серверов БД большая часть бизнес логики приложения выполняется на сервере с использованием хранимых процедур. В связи с этим курсоры разделяются на курсоры сервера и курсоры клиента. Курсор сервера создается и выполняется на сервере, и определяется обычно в хранимых процедурах или триггерах. Курсоры клиента определяются в прикладных программах, выполняемых на клиенте. Набор строк, связанный с данным курсором, пересылается на клиент и там обрабатывается. Если с курсором связан большой набор данных, то операция пересылки набора строк, связанных с курсором, может занять значительное время и значительные ресурсы сети и клиентского компьютера. С этой точки зрения курсоры сервера более экономичны и выполняются быстрее.
Альтернативным подходом, используемым некоторыми разработчиками СУБД, является предоставление в распоряжение программиста библиотеки стандартных функций (API- программный интерфейс пользователя). Функции вызываются из создаваемых пользователем прикладных программ.
Хотя это не является требованием стандарта, многие распространенные СУБД включают соответствующие API. С помощью функций API осуществляется подключение к базе данных, например,ConnectBD(User,Passw), или dbopen((User,Passw) и построение SQL оператора (например, dbsqlexec()) и т.д.
Поставляемые разными разработчиками прикладные API имеют значительные различия. При необходимости использования одной и той же программы в среде разных СУБД необходимы разные ее версии, ориентированные на АPI разных СУБД.
Фирма Microsoft разработала стандарт ODBC (Open Database Connectivity). Эта технология предусматривает использование единого интерфейса для доступа к смешанным базам данных SQL. Данный интерфейс, который встраивается непосредственно в язык программирования (например, С) обеспечивает высокую степень универсальности, в результате чего одно и то же приложение может получать доступ к данным, хранящимся в базах различных целевых СУБД, без необходимости внесения изменений в текст программы.
В приложение, обращающееся к базе данных, записываются вызовы функций ODBC. Для каждой системы управления базами данных разрабатывается драйвер ODBC, реализующий эти функции для конкретной СУБД. Для связи приложения с любой выбранной целевой СУБД пользователю достаточно иметь соответствующий ODBC-драйвер. (Драйвер ОDBC для MS SQL Server устанавливается одновременно с установкой утилит сервера).
Утилита Источники данных ODBC позволяет настроить соединение ODBC для получения доступа к объектам баз данных. Для запуска утилиты следует выбрать соответствующий значок в панели управления Windows. Диалоговое окно утилиты открывает доступ к настройке трех типов источников данных (DSN – Data Source Name: системный DSN, файловый DSN и пользовательский DSN). Драйвер просматривает приложение, находит обращения к базе данных, передает их СУБД, получает от нее результаты и подставляет их в приложение. Идея оказалась очень удачной, и использование ODBC для работы с базами данных стало общепринятым.