Динамический SQL – разновидность программного SQL, предназначенная для встраивания SQL-операторов в текст программы на языке программирования высокого уровня, допускающая динамическое формирование и выполнение запросов во время работы программы.
История возникновения динамического SQL во многом связана с компанией IBM , внедрившей этот мощный инструмент в свою СУБД DB2 . Стандарты SQL , в частности SQL -1, не поддерживали динамического SQL . Лишь в 1992 году в стандарт SQL -2 были включены спецификации динамического SQL . Основной концепцией динамического SQL является следующее утверждение: встроенная инструкция SQL не записывается в исходный текст программы, вместо этого программа формирует текст инструкции во время выполнения в одной из своих областей данных, а затем передает сформированную инструкцию в СУБД для динамического выполнения [ [ 3.1 ] ].
Напомним, что при использовании статического SQL схема реализации подразумевала два этапа – компиляцию программы и выполнение программы. При этом на этап компиляции ложилась основная нагрузка. Именно здесь решались вопросы проверки, разбора и оптимизации запросов , поскольку запрос был заранее известен.
Программы, которые пишут себя сами | Метапрограммирование в C#/.NET: Начало | Expression Trees
Совершенно очевидно, что подобную двухэтапную схему нельзя реализовать для динамического SQL , так как на этапе компиляции программы запрос неизвестен. Поэтому проверку, разборку и оптимизацию запросов здесь приходится выполнять непосредственно во время работы программы.
Таким образом, если эти операции в статическом SQL выполнялись во время компиляции один раз, то в динамическом SQL они будут выполняться столько раз для одного запроса, сколько раз он будет сформирован в процессе работы прикладной программы. Это определяет существенный недостаток динамического SQL – низкую производительность по сравнению со статическим. Достоинство динамического SQL в том, что он позволяет формировать запрос к базе данных во время работы программы, реагируя на те или иные произошедшие события. Такая возможность является жизненно важной для клиент-серверной и трехзвенной архитектур , в которых структура базы данных и деловые правила имеют тенденцию к изменению, что требует определенной гибкости при организации процесса обработки данных.
Учитывая относительно низкую производительность динамического SQL , представляется правильным, там, где только возможно, рекомендовать использование статической разновидности SQL , применяя аппарат динамического SQL где это действительно необходимо.
Динамический SQL также должен содержать дополнительные операторы (по сравнению с интерактивным SQL ). Основные операторы динамического SQL приводятся в следующей таблице.
Источник: intuit.ru
В. И. Швецов Базы данных
Единственный в мире Музей Смайликов
Уроки по SQL | Создание таблиц, добавление данных | Связь один к одному
Самая яркая достопримечательность Крыма
Скачать 8.45 Mb.
ODBC (Open Database Connectivity – открытый доступ к базам данных) – разработанный компанией Microsoft универсальный интерфейс программирования приложений для доступа к базам данных [1].
Основной целью разработки протокола ODBC считается стандартизация механизмов взаимодействия с различными СУБД. Основная проблема, связанная с разработкой приложений, взаимодействующих с базами данных на основе специальных SQL API, состояла в том, что каждая СУБД имела собственный программный интерфейс доступа, каждый из них имел свои особенности и функционировал не совсем так, как другие. В связи с этим разработка приложения существенно зависела от используемой СУБД. Компания Microsoft сделала важный шаг для решения этой проблемы. Основная идея заключалась в разработке универсального интерфейса на уровне семейства операционных систем Windows, который мог бы быть поддержан в разных СУБД.
- интерфейс вызовов функцийODBC: это так называемый верхний уровень ODBC, содержащий API, который и используется непосредственно приложениями. Данный API реализован в виде библиотеки динамической компоновки Dll и входит в состав операционной системы Windows;
- драйверыODBC: это так называемый нижний уровень ODBC, содержащий набор драйверов для СУБД, поддерживающих протокол ODBC. В рамках технологии для каждой СУБД может быть разработан соответствующий ODBC-драйвер, который будет являться промежуточным звеном между прикладной программой и СУБД, транслируя вызовы функций СУБД в вызовы внутренних специализированных функций СУБД. Таким образом решается проблема стандартизации. Для многих современных СУБД существуют специализированные драйверы ODBC, отдельно устанавливаемые в операционную систему;
- диспетчер драйверовODBC: данный программный механизм представляет средний уровень ODBC, управляя процессом загрузки необходимых драйверов.
Рис. 13.5. Схема выполнения программы с использованием протокола ODBC
для доступа к данным
Перечень некоторых базисных функций ODBC API приводится в следующей таблице.
Таблица 13.3.
Протокол JDBC
JDBC (Java Database Connectivity) представляет собой API для выполнения SQL-запросов к базам данных из программ, написанных на языке Java [1].
Рассмотрим основные принципы JDBC.
С развитием глобальных сетей, в частности Интернета, и всех сопутствующих технологий стали появляться новые языки, специально предназначенные для работы в новых условиях. Одним из таких языков является язык программирования Java. В настоящее время Интернет-приложения занимают существенное место на рынке, работая в рамках 2-, 3- и многозвенной архитектуры.
При этом значение языка Java как средства создания приложений, работающих с базами данных, существенно возрастает. Именно это и явилось одной из основных причин разработки нового программного интерфейса – JDBC. Первоначально интерфейс JDBC был разработан компанией Sun Microsystems, в настоящий момент этот API поддерживается всеми ведущими коммерческими СУБД.
- диспетчер драйверов (для подключения к разным СУБД);
- механизм управления сеансами (для одновременной работы с несколькими СУБД);
- механизм передачи инструкций SQL на выполнение в СУБД;
- механизм работы с курсорами (для передачи результатов выполнения запросов из СУБД в приложение).
Версия JDBC 2.0 содержит существенные отличия. Так, вследствие увеличения возможностей интерфейса было проведено его идеологическое разделение на две основные части: Core API (основные возможности) и Extensions API (так называемые расширения).
- Пакетные операции. Программа на Java может осуществить обновление базы данных в пакетном режиме, т.е. одна функция JDBC может добавить в базу данных несколько записей, что положительно сказывается на производительности программ.
- Курсоры с произвольным доступом. В JDBC 2.0 существует средство, позволяющее перемещаться по результатам запроса произвольным образом.
- Обновляемые курсоры. В JDBC 2.0 курсоры, наряду с функцией возврата результата запроса, используются и при обновлении базы данных. Обновления производятся при добавлении или изменении одной из строк в результатах запроса.
- Организация связного пула. Несколько программ на языке Java могут пользоваться совместным доступом к базе данных, уменьшая затраты на подключения к базе данных и отключения от нее. Данный перечень можно продолжить (распределенные транзакции, поддержка JNDI и т.д.).
Библиотека DB-Library
Библиотека DB-Library реализует интерфейс программирования приложений для совместной работы с широко распространенной СУБД Microsoft SQL Server. Данная библиотека является весьма обширной и содержит более 100 функций. Основными из них являются:
dblogin(); dbopen() – подключение к БД;
dbopen(); dbexit() – установка/разрыв соединения с БД;
dbcmd() – передача инструкции (пакета инструкций) SQL в СУБД в текстовом виде;
dbSQLexec() – требование к СУБД выполнить текущий пакет инструкций;
dbcancel() – прекращение выполнения пакета инструкций SQL;
dbresults() – получение результатов выполнения очередной инструкции SQL в текущем пакете;
dbbind(), dbdata(), dbnextrow(), dbnumcols(), dbdatlen() и др. – обработка результатов запросов на выборку данных.
- при помощи указанных выше функций (dblogin(), dbopen()) прикладная программа формирует сведение об авторизации и пытается установить соединение с СУБД;
- при помощи СУБД программа открывает конкретную базу данных, с которой будет происходить работа (dbopen());
- при помощи специальной функции (dbcmd()) программа передает в СУБД текст SQL-инструкции, которую далее необходимо будет выполнить; в библиотеке DB-Library поддерживается так называемый пакетный режим работы. Данный режим подразумевает возможность создания пакетов инструкций. Так, вызывая функцию dbcmd() несколько раз, вы можете передать в СУБД текст нескольких команд SQL, которые впоследствии будут выполнены как одна команда;
- используя функцию dbSQLexec(), программа вызывает выполнение инструкций, переданных ранее при помощи вызовов функций dbcmd();
- вызывая функцию dbresults(), программа может определить, удалось ли СУБД выполнить очередную инструкцию (как правило, число вызовов dbresults() соответствует числу инструкций в очередном пакете);
- в случае если мы имеем дело с запросом, возвращающим набор строк в качестве результата (запросом на выборку), программа при помощи вызовов функции dbbind() осуществляет связывание каждого поля результатов запроса с некоторой областью оперативной памяти. Далее при помощи функции dbnextrow() программа выполняет переход к следующей строке результатов запроса, что приводит к помещению в буфер новых данных;
- при помощи функции dbexit() программа разрывает соединение с базой данных. Библиотека DB-Library представляет собой большой и сложный механизм. Так, в библиотеке предусмотрены специальные механизмы обработки ошибок, разные способы передачи результатов выполнения запросов в прикладную программу и т.д.
Вариант 1.
Особенности программного SQL по сравнению с интерактивным
ð используются принципиально другие операторы
ð пользователь пишет программу на языке SQL
ð+ могут использоваться те же операторы SQL
ð+ запрос на языке SQL встраивается в программу на алгоритмическом языке
Вариант 2.
Какие специальные конструкции (дополнительные операторы) должны быть в программном SQL?
ð оператор цикла
ð оператор ветвления
ð+ оператор, определяющий начало запроса на языке SQL
ð+ оператор, определяющий окончание запроса на языке SQL
ð+ операторы, указывающие дополнительные переменные для обработки результатов запроса
ð операторы, определяющие передачу управления от программы на алгоритмическом языке программе на языке SQL
Вариант 3.
За счет чего последовательность запросов, встроенных в прикладную программу будет выполняться быстрее, чем та же последовательность запросов, выполняемая в интерактивном режиме?
ð+ запросы могут выполняться с опережением
ð+ заранее выполняются действия по анализу и компиляции запросов
ð+ компьютер не ожидает ответных действий пользователя
Задача 2. Как происходит работа с программой при использовании статического SQL?
Вариант 1.
Как должен выглядеть запрос на языке в прикладной программе в этом случае?
ð+ должно быть указано фактическое имя таблицы
ð имя таблицы может быть указано как параметр
ð+ должны быть указаны фактические имена атрибутов
ð имена атрибутов могут быть указаны как параметры
ð в запросах могут широко использоваться переменные
Вариант 2.
Как компилируется и компонуется прикладная программа с встроенным запросом на языке SQL?
ð прикладная программа компилируется вместе с текстом запроса
ð+ текст запроса компилируется отдельно
ð+ в модуль прикладной программы вставляется вызов функции СУБД
Вариант 3.
Как происходит выполнение прикладной программы?
ð+ переход из прикладной программы к запросу осуществляется вызовом специальной функции
ð скомпилированная вместе с текстом запроса прикладная программа автоматически выполняется
ð+ при неоднократном выполнении одного и того же запроса используется один и тот же программный модуль
ð при каждом выполнении одного и того же запроса используются разные программные модули
Задача 3. Характеристика команд статического SQL
Вариант 1.
Какие операторы могут быть использованы в статическом SQL?
ð+ SELECT
ð+ DELETE
ð+ INSERT
ð+ DECLARE TABLE
ð+ EXEC SQL
ð+ OPEN
Вариант 2.
Какие специальные операторы могут быть использованы в статическом SQL?
ð SELECT
ð+ DECLARE TABLE
ð+ EXEC SQL
ð+ GET DIAGNOSTIC
ð+ DECLARE CURSOR
Вариант 3.
Какие специальные операторы могут быть использованы в статическом SQL для указания начала и конца SQL- запроса?
ð DECLARE TABLE
ð+ EXEC SQL
ð GET DIAGNOSTIC
ð+ ; (точка с запятой)
ð END DECLARE
Задача 4. Особенности динамического SQL по сравнению со статическим ?
Вариант 1.
Как должен выглядеть запрос на языке в прикладной программе в этом случае?
ð запрос должен быть определен в тексте прикладной программы
ð+ запрос формируется во время работы прикладной программы
ð+ имя таблицы может быть указано как параметр
ð+ имена атрибутов могут быть указаны как параметры
ð+ в запросах могут широко использоваться переменные
ð переменные могут использоваться в запросах только на месте констант
Вариант 2.
Как компилируется и компонуется прикладная программа при использовании динамического SQL?
ð прикладная программа компилируется вместе с текстом запроса
ð текст запроса компилируется отдельно один раз
ð сформированный модуль запроса вставляется в модуль прикладной программы
ð+ в модуль прикладной программы вставляется вызов функции СУБД
ð+ текст запроса компилируется столько раз, сколько раз запрос формируется прикладной программой
Вариант 3.
Как происходит выполнение прикладной программы при использовании динамического SQL?
Источник: topuch.com
Швецов В.И. Базы данных
Перечень некоторых базисных функций ODBC API приводится в следующей таблице .
Таблица 13.3.
Базисные функции ODBC API
Назначение Функция Описание
SQLAlocEnv Получает указатель окр ужения . Одно окру —
жение может служить для создания несколь —
ких соединений .
SQLAlIoc Connect Получает указатель соединения .
Соединение с источником
SQLConnect Соединяется с указанн ым драйвер ом , ис —
пользуя имя источника данных , идентифика —
тор пользователя и пароль .
SQLAllocStmt Размещает указат ель выражения .
SQLPrepare Подготавливает SQL выражение для даль —
нейшего использования .
Подготовка SQL
SQLGet CursorName Возвращает имя , связанно е c указателем вы —
SQLSet CursorName Устанавливает имя курсора .
Выполнение запросов SQLExecute Выполняет заранее подготовленный запрос .
SQLExec Direct Выполняет запрос .
SQLRow Count Возвращает количество записей , задейство —
ванных в операциях вставки , удаления , мо —
SQLNum ResultCol Возвращает количество колонок в выбран —
ном наборе данных .
SQLDescribe Col Описывает колонку в выбранном наборе
SQLCol Attributes Описы вает атрибуты колонки в выбранном
наборе данных .
SQLBindCol Присваивает место в памяти для ко лонки в
выбранном наборе данн ых и у казывает ее
тип данных .
Выборка результатов и
информации о результа —
SQLFetch Возвращает несколько наборов данных .
Протокол JDBC
JDBC (Java Database Connectivity) представляет собой API для выполнения SQL-
запросов к базам данных из программ , написанных на языке Java [1].
Рассмотрим основные принципы JDBC.
С развитие м глобальных сетей , в частности Интернета , и всех сопутствующих техноло —
гий стали появляться новые языки , специально предназначенные для работы в новых усло —
виях . Одним из таких языков является язык программирования Java. В настоящее время
тернет — приложения занимают существенное место на рынке , работая в рамках 2-, 3- и много —
звенной архитекту ры . При этом значение языка Java как средства создания приложений , ра —
ботающих с базами данных , существенно возрастает . Именно это и явилось одной из основ —
ных причин разработки нового программного интерфейса – JDBC. Первоначально интерфейс
JDBC был разработан компанией Sun Microsystems, в настоящий
момент этот API поддержи —
вается всеми ведущими коммерческими СУБД .
Известно несколько различных версий JDBC. Так , версия 1.0 содержала некоторые
средства доступа к данным :
• диспетчер драйверов ( для подключения к разным СУБД );
• механизм управления сеансами ( для одновременной работы с несколькими СУБД );
• механизм перед ачи инструкций SQL на выпо лнение в СУБД ;
• механизм рабо ты с курсорами ( для передачи результатов выполнения запросов из
СУБД в приложение ).
Этот перечень определенным образом напоминает аналогичный фу нкциональный ап —
парат протокола ODBC.
Версия JDBC 2.0 содержит существенные отличия . Так , вследствие увеличения воз —
можностей интерфейса было проведено его идеологическое разделение на две основные час —
ти : Core API ( основные возможности ) и Extensions API ( так называемые расширения ).
В [1] указ аны следующие возможности JDBC:
• Пакетные операции . Программа на Java может осу ществить обновление базы данных в
пакетном режиме , т . е . одна функция JDBC может добавить в базу данных несколько за —
писей , что положительно сказывается на производительности программ .
• Курсоры с произвольным доступом . В JDBC 2.0 существует средство , позволяющее
перемещаться по результатам запроса произвольным образом .
• Обновляемые курсоры . В JDBC 2.0 ку рсоры , наряду с функцией возврата резу льтата
запроса , использу ются и при обновлении базы данных . Обновления производятся при
добавлении или изменении одной из строк в результатах запроса .
• Организация связного пула . Несколько программ на языке Java могут пользоваться со —
вместным доступом к базе данных , у меньшая затраты на подключения к базе данных и
отключения от нее . Данный перечень можно продолжить ( распределенные транзакции ,
поддержка JNDI и т . д .).
Версия JDBC 3.0 появилась совсем недавно и содержит такие новации , как объектно —
реляционные расширения SQL и улучшенн ые механизмы обработки транзакций .
ра JDBC берет свое начало от ODBC и в существенной части повторяет ее , поэ тому схема
выполнения программы на Java с использованием протокола JDBC для доступа к данным
полностью аналогична схеме на рис . 13.5 ( слова ODBC заменяются на слова JDBC). В от —
личие от ODBC, драйверы JDBC подразделяются на четыре типа . Основные отличия между
этими типами связаны с местонахождением API СУБД
( на клиентской или серверной СУБД )
и способом доступа к базе данных ( через собственный API СУБД или через ODBC).
Библиотека DB-Library
Библиотека DB-Library реализует интерфейс программирования приложений для со —
вместной работы с широко распространенной СУБД Microsoft SQL Server. Данная библио —
тека является весьма обширной и содержит более 100 функций . Основными из них являются :
dblogin(); dbopen() – подключение к БД ;
dbopen(); dbexit() – устан овка / разрыв соединения с БД ;
dbcmd() – передача инструкции ( пакета инструкций ) SQL в СУБД в текстовом виде ;
dbSQLexec() – требование к СУБД выполнить текущий
пакет инструкций ;
dbcancel() – прекращение выполнения пакета инструкций SQL;
dbresults() – получение результатов выполнения очередной инстру кции SQL в теку щем
dbbind(), dbdata(), dbnextrow (), dbnumcols(), dbdatlen() и др . – обработка результатов за —
просов на выборку данных .
Логика работы прикладной программы , обрабатывающей данные , хранящиеся в базе
данных под упр авл ен ие м Microsoft SQL Server, выглядит следующим образом :
• при помощи у казанных выше функций (dblogin(), dbopen()) прикладная программа
формирует сведение об авторизации и пытается уст анов ит ь соединение с СУБД ;
• при помощи СУБД программа открывает конкретную ба зу данных , с которой бу дет
происходить работа (dbopen());
• при помощи специальной функции (dbcmd()) программа передает в СУБД текст
SQL- инструкции , которую далее необходимо будет выполнить ; в библиотеке DB-
Library поддерживается так называемый пакетный режим работы . Данный режим
подразумевает возможность создания пакетов инструкций . Так , вызывая функцию
dbcmd() несколько раз , вы можете передать в СУБД текст нескольких команд SQL,
которые впоследствии бу ду т выполнены как одна
• использу я функцию dbSQLexec(), программа вызывает выполнение инструкций , пе —
реданных ранее при помощи вызовов функций dbcmd();
• вызывая функцию dbresults(), программа может определить , удалось ли СУБД вы —
полнить очередную инструкцию ( как правило , число вызовов dbresults() соответст —
вуе т числу инструкций в очередном пакете );
• в случае если мы имеем дело с запросом , возвращающим набор строк в качестве ре —
зультата ( запросом на выборку ), программа при помощи вызовов функции dbbind()
осуществляет связывание каждого поля результатов запроса с некоторой областью
оперативной памяти . Далее при помощи фу нкции dbnextrow() программа выполняет
переход к следу ющей строке результатов запроса , что приводит к помещению в
фер новых данных ;
• при помощи функции dbexit() программа разрывает соединение с базой данных .
Библиотека DB-Library представляет собой большой и сложный механизм . Так , в
библиотеке предусмотрены специальные механизмы обработки ошибок , разные спо —
собы передачи результатов выполнения запросов в прикладну ю программу и т . д .
Краткие итоги : В лекции рассматриваются разные технологии формирования запросов
на языке SQ L в прикла дных программах ( программный SQL). Дается понятие статического
SQL, динамического SQL и приводятся соответствующие основные операторы . Рассматри —
ваются интерфейсы программирования приложений (API) ( протокол ODBC, протокол JDBC,
библиотека DB-Library).
Источник: www.studmed.ru