Язык программирования баз данных Informix-4GL

         

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


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

  • интерактивные программы, в которых пользователь вводит данные и тем самым формирует запрос с терминала;
  • программы, предназначенные для работы с различными базами данных, структура которых может меняться.
  • С помощью динамического SQL программа-клиент выполняет программное формирование оператора SQL для его последующего исполнения, делая это в три этапа:

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

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

  • в динамический оператор Select нельзя включать спецификатор Into, в котором используются главные переменные;
  • в любом месте, где главная переменная могла бы появиться в выражении SQL-оператора, ей соответствует знак вопроса.
  • При формировании оператора Prepare можно воспользоваться как символьной строкой (либо функцией, возвращающей символьное значение), так и ранее определенной символьной переменной. Результатом выполнения оператора Prepare является структура данных, имеющая имя и отображающая строку символов с текстом оператора SQL.



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

    Значения главных переменных, используемые при формировании SQL-оператора, могут быть получены из пользовательского ввода и присоединены к текстовой строке на этапе формирования SQL-оператора.
    В этом случае отпадает необходимость использования знака "?".



    Указатели позиции "?" не могут быть использованы вместо идентификаторов SQL таких, как имя базы данных, имя таблицы или столбца: эти идентификаторы должны указываться в тексте оператора при его подготовке. Если эти идентификаторы не известны во время написания программы, они могут быть получены из пользовательского ввода, аналогично предыдущему примеру.



    Замечаниe. Запрещенными для динамического формирования являются операторы, непосредственно связанные с динамическим SQL (Prepare, Execute), операторы управления курсором (Declare, Open, Fetch, ...), а также операторы работы на уровне базы данных (Create database, Database, ...).

    Выполнение подготовленного SQL-оператора

    Подготовленный по оператору Prepare динамический оператор (группу операторов) можно многократно выполнять. С помощью оператора Execute выполняются операторы, отличные от операторов Select, а также операторы Select, которые возвращают в качестве результата одну строку. Если оператор Select возвращает более одной строки, динамический оператор Select выполняется не с помощью оператора Execute, а подключается к курсору и в дальнейшем используется обычным образом с помощью курсорных средств. В обоих случаях при выполнении динамического оператора с помощью спецификатора Using ему передаются главные переменные, участвующие в выражениях и принимающие возвращаемые значения и, по сути, играющие роль фактических параметров .



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

  • Символьная строка, задающая оператор Select, помещается в программную переменную. Она содержит два заполнителя, отмеченных знаком вопроса.


  • Оператор PREPARE преобразует символьную строку в структуру данных с именем q_orders, которая может быть выполнена.


  • Объявляется курсор с именем cu_orders и связывается с именем подготовленного оператора.




  • Вводятся необходимые параметры для SQL-оператора.


  • При открытии курсора выполняется подготовленный оператор. Спецификатор Using в операторе Open указывает имена двух главных переменных, содержимое которых заменяет знаки вопроса, указанные в исходном операторе.


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


  • Оператор Free служит для освобождения памяти. Оператор Free получает либо имя оператора, либо имя курсора, объявленного для оператора с этим именем, и освовождает память, занятую подготовленным оператором.



    Для простых операторов, не требующих курсора или главных переменных, можно объединить действия операторов Prepare, Execute, Free в одной операции. Оператор Execute Immediate получает строку символов, подготавливает ее, выполняет и освобождает память.




    Содержание раздела