Нижегородский государственный университет им. Н.И.Лобачевского
Опубликован: 04.06.2009 | Доступ: свободный | Студентов: 15885 / 4913 | Оценка: 4.34 / 4.09 | Длительность: 14:55:00
Лекция 13:

Использование языка SQL в прикладных программах

< Лекция 12 || Лекция 13: 123 || Лекция 14 >
Аннотация: В лекции рассматриваются разные технологии формирования запросов на языке SQL в прикладных программах (статическое формирование запроса, динамическое формирование запроса, использование библиотек)

Цель лекции: показать основные возможности формирования запросов к базе данных из прикладных программ.

13.1. Программный (встроенный) SQL

Основная работа с базой данных проводится с использованием прикладных программ, из которых и идут запросы к базам данных. В этом случае интерактивный режим работы не может быть использован, текст SQL- запроса должен быть либо включен в прикладную программу (если запрос полностью определен заранее), либо формироваться в процессе работы прикладной программы.

Программный SQL предназначен для того, чтобы встраивать SQL-запросы в прикладную программу, написанную на одном из языков программирования. При этом возникают следующие вопросы:

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

Решение этих проблем частично описано в стандарте SQL.

Рассмотрим алгоритм выполнения SQL-запросов в интерактивном режиме работы. Легко видеть, что пользователь вынужден ожидать результатов выполнения запроса в течение всего времени работы реализации SQL-запроса. Если через некоторое время пользователю снова нужно будет выполнить тот же самый запрос, СУБД вновь проделает те же самые действия, что и при предыдущем обращении. Налицо некоторое несовершенство механизма:

  • одни и те же этапы выполняются каждый раз заново для одинаковых запросов;
  • СУБД не может обрабатывать интерактивные запросы с опережением.

Решение подобных проблем очевидно – часть действий по обработке запроса необходимо выполнять один раз, сохранять результат в некотором виде, а потом использовать столько раз, сколько необходимо. Эта идея является одной из основных идей программного SQL. Таким образом, программный SQL позволяет:

  • использовать операторы интерактивного SQL в тексте программы на языке программирования высокого уровня;
  • наряду с операторами интерактивного SQL использовать новые специальные конструкции, дополняющие SQL и увеличивающие его возможности;
  • для передачи параметров в запрос использовать в тексте запроса переменные, объявленные в программе;
  • для возврата в программу результатов запроса использовать специальные конструкции, отсутствующие в интерактивном SQL;
  • осуществлять компиляцию запросов совместно с программой, обеспечивая впоследствии согласованную работу программы и СУБД. Заранее (на этапе компиляции) выполнять действия по анализу и оптимизации запросов, экономя время, затрачиваемое на этапе выполнения программы.

На настоящий момент используются три варианта встраивания запросов на языке SQL в прикладную программу (программного SQL): статический SQL, динамический SQL и метод, основанный на различных интерфейсах программирования приложений ( API ). Рассмотрим соответствующие варианты.

13.2. Статический SQL

Статический SQLразновидность программного SQL, предназначенная для встраивания SQL-операторов в текст программы на языке программирования высокого уровня.

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

Рассмотрим два основных этапа, связанных с работой статического SQL, – компиляция программы и работа (выполнение) программы.

Схема компиляции и сборки программы выглядит следующим образом ( рис. 13.1):

  • Программа, включающая операторы языка программирования высокого уровня (ЯПВУ) вместе с операторами SQL, подается на вход специального препроцессора, который выделяет из нее части, связанные с SQL.
  • Вместо инструкций встроенного SQL препроцессор подставляет вызовы специальных функций СУБД. Библиотеки таких функций для связи с языками программирования существуют для всех распространенных серверных СУБД. Стоит особо отметить, что эти библиотеки имеют "закрытый" интерфейс, т.е. разработчики библиотеки могут менять его по своему усмотрению, соответственно обновив препроцессор. Все это говорит о том, что программист не должен вмешиваться в этот процесс.
  • Сами инструкции SQL препроцессор выделяет в отдельный файл.
  • Программа поступает на вход обычного компилятора языка программирования, после чего получаются объектные модули. Далее эти объектные модули вместе с библиотеками СУБД собираются в один исполняемый модуль – приложение.
  • Наряду с этими операциями происходит работа с файлом, содержащим SQL-инструкции. В литературе этот модуль часто носит название "модуль запросов к базе данных" (Database Request Module, DBRM) [1]. Обработку этого модуля осуществляет специальная утилита, которая обычно носит название BIND. Для каждой инструкции SQL утилита выполняет следующие действия:
    • осуществляет синтаксический анализ запроса (проверяет, является ли запрос корректным);
    • проверяет, существуют ли в базе данных те объекты, на которые ссылается запрос;
    • выбирает, каким образом осуществлять выполнение запроса – план выполнения запроса;
  • Все планы выполнения запросов сохраняются в СУБД для последующего использования.
Схема компиляции программы с встроенными инструкциями статического SQL

Рис. 13.1. Схема компиляции программы с встроенными инструкциями статического SQL

Схема выполнения программы выглядит следующим образом ( рис. 13.2.):

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

Схема выполнения программы с встроенными инструкциями статического SQL

Рис. 13.2. Схема выполнения программы с встроенными инструкциями статического SQL

Для реализации вышеуказанных схем статический SQL должен содержать дополнительные операторы (по сравнению с интерактивным SQL), позволяющие компилятору выделить в тексте программы SQL-запросы, объявлять используемые в этих запросах таблицы, объявлять переменные для обработки ошибок, как результатов реализации запросов и т. п. Основные команды статического SQL приводятся в следующей таблице.

Таблица 13.1. Основные команды статического SQL
EXEC SQL Спецификатор, указывающий, что следующая за ним инструкция является инструкцией встроенного SQL
; В языке C – признак окончания инструкции встроенного SQL
DECLARE TABLE Объявляет таблицу, которая потом будет использоваться в инструкциях встроенного SQL
SQLCODE Переменная для обработки ошибок
SQLSTATE Переменная для обработки ошибок
GET DIAGNOSTICS Инструкция для обработки ошибок
WHENEVER
  SQLERROR
  SQLWARNING
  NOT FOUND
GOTO
CONTINUE
Набор совместно используемых инструкций для упрощения обработки ошибок
BEGIN DECLARE SECTION
END DECLARE SECTION
Инструкции для определения области, в которой будут объявлены переменные, впоследствии используемые в запросах SQL
INTO Используется в операторе SELECT для указания переменной, в которую необходимо поместить результат выполнения запроса
DECLARE CURSOR Курсор – специальный инструмент, предназначенный для обработки результатов запроса, содержащих более одной строки. Работа с курсором похожа на работу с файлами. Данная инструкция служит для создания курсора и связывания его с конкретным запросом
OPEN Команда, открывающая курсор и побуждающая СУБД начать выполнение запроса. Устанавливает курсор перед первой строкой результата запроса
FETCH Команда, перемещающая указатель текущей строки (курсор) на следующую строку. В некоторых СУБД и стандарте SQL-92 реализованы разные формы команды FETCH, перемещающие курсор на произвольную строку результатов запроса
CLOSE Закрывает курсор и прекращает доступ к результатам запроса

Использование описанной выше схемы компиляции/сборки/выполнения программы позволяет:

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

Однако статическая разновидность программного SQL имеет некоторые существенные ограничения. Так, переменные в запросах могут использоваться только в тех местах, где в запросах обычно стоят константы. Например, нельзя задавать имя таблицы, из которой производится выборка, а также названия столбцов, как параметр. В связи с этим при использовании статического варианта вложенного (программного) SQL необходимо на этапе написания программы точно знать состав запросов, которые необходимо будет выполнять в прикладной программе. Во многих случаях это ограничение является существенным. Для его устранения была введена новая разновидность программного SQLдинамический SQL. Рассмотрим кратко основные идеи динамического SQL.

< Лекция 12 || Лекция 13: 123 || Лекция 14 >
Александра Каева
Александра Каева
Карина Максутова
Карина Максутова