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

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

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

Наиболее простой формой динамического SQL является оператор EXECUTE IMMEDIATE (выполнить немедленно). Программа передает на исполнение оператор SQL, сформированный предварительно в виде текстовой строки и не яляющийся запросом на чтение. Оператор EXECUTE IMMEDIATE обеспечивает одноэтапное выполнение динамического оператора.

Если в программе должны выполняться однотипные операторы SQL, можно по команде PREPARE единственный раз произвести синтаксический разбор и оптимизацию оператора. Оператор EXECUTE в этом случае использует проведенную работу и может выполняться многократно с разными параметрами. Этот двухэтапный метод выполнения запроса способствует уменьшению объема вычислений программы.

Операторы EXECUTE IMMEDIATE и EXECUTE не поддерживают динамические запросы на чтение, поскольку у них отсутствует механизм обработки результатов запроса. Для реализации динамических запросов на чтение используется аппарат курсоров. Программа может не знать заранее, с какими таблицами и столбцами оперирует запрос. Оператор DESCRIBE служит для получения из СУБД описания динамического запроса, ранее подготовленного оператором PREPARE. Описание запроса содержится в специальной области СУБД, называемой дескриптором. Как и ранее, выполнение запроса на чтение инициируется при открытии соответствующего курсора оператором OPEN.