Опубликован: 05.01.2004 | Уровень: специалист | Доступ: свободно | ВУЗ: Московский государственный университет имени М.В.Ломоносова
Лекция 9:

Встроенный SQL

< Лекция 8 || Лекция 9: 123 || Лекция 10 >
Аннотация: В лекции обсуждаются вопросы встраивания операторов языка SQL в основной язык программирования.

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

Статический SQL встраивается в виде препроцессорной обработки в традиционные языки программирования.

Операторы SQL обрабатываются прекомпилятором.

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

Операторы:

DECLARE CURSOR - определяет запрос;

OPEN и CLOSE - начинает и завершает процесс обработки.

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

main()
// Включение структуры для обработки ошибок
{    EXEC SQL INCLUDE SQLCA;
// Объявление хост-переменных 
// (связи и INTO-переменные)
     EXEC SQL BEGIN DECLARE SECTION;
     int NumIndID;
     int NumID;       // Эти переменные
     // указываются после символа :
char Sal[10];
     EXEC SQL END DECLARE SECTION;
// Обработка ошибок
     EXEC SQL WHENEVER SQLERROR GOTO err_1;
     EXEC SQL WHENEVER NOT FOUND GOTO err_2;
// Запрос параметров
printf ("Type individual number: ");
scanf("%d",&NumIndID);
// Выполнение SQL запроса
EXEC SQL SELECT NumID, Sal FROM tbl1
     WHERE NumIndID =: NumIndID
     INTO :NumID, :Sal;
// Отображение результата
     std::cout<< "Number: "<<NumID;
     exit(0);
err_1:
     std::cout<<'' SQLERROR'';
     exit(1);
err_2:
     std::cout<<'' NOT FOUND";
     exit(1); }

Типы данных преобразуются автоматически для каждой СУБД.

СУБД возвращает информацию об ошибках через специальные переменные: структуру SQL Communication AREA ( SQLCA ), переменную SQLSTATE или SQLCODE.

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

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

  • встраивание в код некоторого языка программирования SQL-операторов (статический SQL);
  • формирование в процессе выполнения программы на некотором языке программирования кода SQL-операторов и дальнейшего их выполнения (динамический SQL);
  • вызов из программ, написанных на других языках программирования, SQL-модулей, которые представляют собой код на языке SQL;
  • использование API (Application Programming Interface), позволяющего реализовывать работу с базой данных через предоставляемый набор функций. API может быть целевым, предоставленным производителем коммерческой СУБД для работы именно с этой базой данных, или межплатформенным, реализующим унифицированные средства доступа к СУБД различных производителей. К такому API относятся ODBC (Open DataBase Connectivity) и SQL/CLI (SQL Call Level Interface).

Основная программа

Основной программой, или HOST-программой, называется программа, в которую встраиваются SQL-операторы.

Встраиваемый SQL-оператор указывается после фразы EXEC SQL.

Стандартом SQL-92 предусмотрена возможность встраивания SQL-операторов в следующие языки программирования: C, Pascal, Java (SQLJ), Ada, Cobol, Fortran, PL/1, M.

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

Процесс выполнения программы, содержащей операторы встроенного SQL.

Рис. 9.1. Процесс выполнения программы, содержащей операторы встроенного SQL.

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

Таким образом, выполнение SQL-оператора было последовательно заменено на вызов внешней процедуры, которая затем была связана с библиотекой СУБД. Поэтому на этапе выполнения библиотечные вызовы будут передаваться непосредственно СУБД.

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

Переменные во встроенном SQL

Во встроенном SQL можно использовать переменные основного языка программирования. Они применяются:

  • в выражениях;
  • как INTO-переменные ;
  • как переменные связи (bind-переменные) ;
  • как индикаторные переменные.

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

Перед тем как использовать такую переменную, она должна быть объявлена в разделе объявления SQL-переменных. Объявление SQL-переменных указывается между парой операторов EXEC SQL BEGIN DECLARE SECTION; и EXEC SQL END DECLARE SECTION;.

В основной программе может быть произвольное число разделов с объявляемыми переменными, но они могут быть указаны только в тех местах, в которых синтаксис основного языка допускает выполнять объявление переменных. Внутри операторов EXEC SQL BEGIN DECLARE SECTION и EXEC SQL END DECLARE SECTION синтаксис объявления переменных также соответствует языку программирования, в который встраиваются SQL-операторы.

Например:

// Код для объявления переменных на языке С++:
     EXEC SQL BEGIN DECLARE SECTION;
     int var1;
     int var2;
     char var3[10];
     EXEC SQL END DECLARE SECTION;
// Код для объявления переменных на языке Pascal:
     EXEC SQL BEGIN DECLARE SECTION; 
     var;
     var1: integer;
     var2: integer;
     var3: array (1..10) of char;
     EXEC SQL END DECLARE SECTION;

Применение INTO-переменных

INTO-переменные служат для извлечения данных из результирующего набора в переменные основного языка программирования. Какая бы технология доступа к БД ни использовалась в приложении, после формирования результирующего набора данные для дальнейшей обработки (изменения, отображения, печати и т.п.) всегда должны быть извлечены в переменные, с которыми может работать основной язык программирования. Во встроенном SQL оператор SELECT сразу может указать имена переменных, в которые будут занесены результаты запроса. Такие переменные называются INTO-переменными .

Для использования INTO-переменных существуют следующие ограничения:

  • результирующий набор гарантированно должен возвращать только одну строку;
  • тип каждой INTO-переменной должен соответствовать типу столбца, значение которого записывается в эту переменную.

Результирующий набор будет гарантированно возвращать только одну строку в следующих случаях:

  • при использовании в предикате значения поля, являющегося уникальным в силу объявления его как PRIMARY KEY или UNIQUE ;
  • при агрегировании данных всей таблицы, когда в списке полей указывается агрегирующая функция, а фраза GROUP BY отсутствует;
  • если структура используемых таблиц и синтаксис оператора SELECT однозначно определяют возвращаемую строку.

Например:

EXEC SQL SELECT f1,f2,f3 FROM tbl1 
         INTO :var1, var2, var3 WHERE f1=1;

Имена INTO-переменных могут совпадать с именами полей, так как это разные идентификаторы, отличающиеся наличием у INTO-переменных символа "двоеточие".

< Лекция 8 || Лекция 9: 123 || Лекция 10 >