Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции по серверам.doc
Скачиваний:
5
Добавлен:
01.04.2025
Размер:
749 Кб
Скачать
☆
  1. Организация доступа к бд из прикладных программ

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

Язык SQL предназначен для организации доступа к БД. Доступ к данным может быть осуществлен в 2-х режимах:– интерактивном и в режиме выполнения приложений. SQL не является языком программирования. Для создания приложений используются другие языки, в которые встраиваются операторы SQL. Все возможности интерактивного языка запросов доступны и в прикладном программировании

Существует 2 способа применения SQL в прикладных программах:

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

  • Интерфейс программирования приложений (API). При использовании этого метода прикладная программа взаимодействует с СУБД путем применения специальных функций. Вызывая эти функции, программа передает СУБД операторы SQL и получает обратно результаты запросов.

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

  • Операторы SQL включаются в текст программы на исходном языке программирования. Исходная программа поступает на вход препроцессора, который компилирует операторы SQL.

  • Встроенные операторы SQL могут ссылаться на переменные базового языка программирования.

  • Встроенные операторы SQL получают результаты SQL запросов с помощью переменных базового языка программирования.

  • Для обеспечения построчной обработки результатов запроса во встроенный SQL добавлено несколько новых операторов, отсутствующих в интерактивном SQL.

При встраивании в программу операторов манипулирования данными они не требуют никаких изменений. Изменений требует только оператор SELECT. В интерактивном SQL набор данных, возвращаемый оператором SELECT, просто выводится на экран. Встроенный в программу оператор SELECT должен создавать структуры данных, которые согласуются с базовым языком программирования. Во встроенном SQL запросы делятся на 2 типа:

  • Однострочные. Строка может содержать значения нескольких столбцов.

  • Многострочные запросы. При этом приложение должно иметь возможность обработать все строки. Значит должен существовать механизм, поддерживающий просмотр и обработку большого числа строк.

Вывод запроса трудно передать переменным, если неизвестно, насколько велики будут результаты вывода. В SQL это осуществляется с помощью курсора.

Первый тип запроса во встроенном SQL вызвал модификацию оператора SELECT, который выглядит следующим образом:

SELECT < список атрибутов>

INTO <список переменных базового языка>

FROM

WHERE

В указанные переменные будет помещен результат однострочного запроса, поэтому список переменных должен быть согласован как по порядку, так и по типу данных со списком возвращаемых атрибутов.

Для реализации многострочных запросов вводится новое понятие – курсора или указателя записей.

Курсор – это вид переменной, которая связана с запросом. Значением этой переменной может быть каждая строка, которая выводится при запросе. Курсор должен быть объявлен прежде, чем он будет использован. Для объявления курсора служит команда DECLARE CURSOR. Оператор определяет исполняемый запрос, задает имя курсора и связывает результаты запроса с заданным курсором.

DECLARE STIPCUR CURSOR

FOR

SELECT NOM_ZACH,SFAM,STIP

FROM STUDENTS

WHERE STIP=30;

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

Оператор OPEN CURSOR дает команду СУБД выполнить описанный запрос, создать виртуальный набор строк, который соответствует заданному запросу. Оператор OPEN устанавливает курсор (указатель записей) перед первой строкой виртуального набора строк результата.

Итак, когда в программе необходимо выполнить запрос, то открывают курсор с помощью следующей команды:

EXEC SQL OPEN CURSOR STIPCUR;

Значения в курсор передаются именно тогда, когда выполняется приведенная выше команда.

После открытия указатель текущей строки установлен перед первой строкой курсора.

Команда 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.

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

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