Динамический SQL
В ряде приложений возникает необходимость в динамическом формировании SQL-операторов по ходу выполнения программы. Этого могут потребовать:
С помощью динамического SQL программа-клиент выполняет программное формирование оператора SQL для его последующего исполнения, делая это в три этапа:
Подготовка операторов
Динамический оператор SQL по форме напоминает любой другой 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 ему передаются главные переменные, участвующие в выражениях и принимающие возвращаемые значения и, по сути, играющие роль фактических параметров .
Последний пример иллюстрирует случай использования курсора для выполнения динамически подготовленного оператора. Последовательность выполнения действий в примере:
Оператор Free служит для освобождения памяти. Оператор Free получает либо имя оператора, либо имя курсора, объявленного для оператора с этим именем, и освовождает память, занятую подготовленным оператором.
Для простых операторов, не требующих курсора или главных переменных, можно объединить действия операторов Prepare, Execute, Free в одной операции. Оператор Execute Immediate получает строку символов, подготавливает ее, выполняет и освобождает память.