
- •Cтатический и динамический sql
- •Статический sql
- •Основная программа
- •Переменные во встроенном sql
- •Применение into-переменных
- •Переменные связи
- •Курсоры
- •Обработка null-значений
- •Позиционированные операторы
- •Обработка ошибок
- •Создание операторов динамического sql
- •Одношаговый интерфейс
- •Многошаговый интерфейс
- •Динамические параметры
- •Динамические курсоры
Cтатический и динамический sql
Структурированный язык запросов SQL реализуется в следующих формах:
-
интерактивный SQL;
-
статический SQL;
-
динамический SQL;
-
встроенный SQL.
Интерактивный SQL позволяет конечному пользователю в интерактивном режиме выполнять SQL-операторы. Все СУБД предоставляют инструментальные средства для работы с базой данных в интерактивном режиме. Например, СУБД Oracle включает утилиту SQL*Plus, позволяющую в строчном режиме выполнять большинство SQL-операторов.
Статический SQL может реализовываться как встроенный SQL или модульный SQL. Операторы статического SQL определены уже в момент компиляции программы.
Динамический SQL позволяет формировать операторы SQL во время выполнения программы.
Встроенный SQL позволяет включать операторы 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).