Опубликован: 04.06.2009 | Уровень: специалист | Доступ: платный | ВУЗ: Нижегородский государственный университет им. Н.И.Лобачевского
Лекция 13:

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

< Лекция 12 || Лекция 13: 123 || Лекция 14 >

13.3. Динамический SQL

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

История возникновения динамического SQL во многом связана с компанией IBM, внедрившей этот мощный инструмент в свою СУБД DB2. Стандарты SQL, в частности SQL-1, не поддерживали динамического SQL. Лишь в 1992 году в стандарт SQL-2 были включены спецификации динамического SQL. Основной концепцией динамического SQL является следующее утверждение: встроенная инструкция SQL не записывается в исходный текст программы, вместо этого программа формирует текст инструкции во время выполнения в одной из своих областей данных, а затем передает сформированную инструкцию в СУБД для динамического выполнения [ [ 3.1 ] ].

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

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

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

Таблица 13.2. Основные команды динамического SQL
EXECUTE IMMEDIATE Немедленное выполнение инструкции
PREPARE Подготовка инструкции к выполнению
EXECUTE Выполнение подготовленной ранее инструкции
DESCRIBE Специальная команда, участвующая при возврате результата выполнения инструкций динамического SQL
DECLARE CURSOR Разновидность инструкции DECLARE CURSOR, применявшейся ранее в рамках статического SQL, содержащая вместо запроса его имя (связанное с запросом при помощи инструкции PREPARE )
OPEN
FETCH
CLOSE
Разновидности инструкций для работы с курсором в динамическом SQL

Рассмотрим схему функционирования динамического SQL ( рис. 13.3). Схема предусматривает одноэтапное и двухэтапное выполнение инструкций.

Одноэтапное выполнение инструкций осуществляется командой EXECUTE IMMEDIATE.

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

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

Схема выполнения инструкции подразумевает:

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

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

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

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

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

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

На этапе выполнения СУБД подставляет значения параметров (полученные из программы) и использует сформированный ранее план выполнения для достижения результата.

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

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