Галерея
7757 8119 8300 8698 8817 9504 9722 9937
Интересные записи
Новое на сайте
Новое

Динамические DML и DDL

Динамические DML и DDLДинамический SQL предлагает два метода выполнения практически любой инструкции DML или DDL в программе. Первый из методов носит название EXECUTE IMMEDIATE; он позволяет отправить сформированную программным путем строку, представляющую инструкцию DML/DDL, в СУБД за одно действие. Альтернативой может служить двухэтапное динамическое выполнение, состоящее из двух инструкций: PREPARE и EXECUTE.

Одноэтапный вариант — простейший способ выполнения динамического запроса SQL в управляющей программе. Вначале программа формирует строку запроса SQL на основе пользовательского ввода, аргументов командной строки и т. п., а затем сохраняет ее в предварительно объявленной строковой переменной. Эта переменная затем передается в СУБД с помощью инструкции EXECUTE INMMEDIATE и обрабатывается ядром сервера баз данных (одновременно выполняются все пять этапов обработки запроса). СУБД возвращает в управляющую программу код завершения с помощью переменной В следующем примере продемонстрировано, как сформировать и динамически выполнить инструкцию SQL, которая обновляет столбец PROD_PRICE_N таблицы PRODUCT значениями 25,50 в строках, удовлетворяющих заданному критерию (использован синтаксис языка C).

Двухэтапное выполнение более сложное. Инструкция SQL формируется тем же способом, что и для команды EXECUTE IMMEDIATE; единственное отличие в том, что в данном случае можно использовать символ макроподстановки (шаблона) в виде вопросительного знака вместо любой лексемы из дерева группы, который впоследствии будет заменен фактическим значением. Сама инструкция отправляется в качестве аргумента командой PREPARE, выполняющей первые четыре из пяти этапов обработки инструкции SQL (синтаксический анализ, проверку, оптимизацию и генерацию плана выполнения). Последний этап выполняется с помощью команды EXECUTE, которая замещает маркеры параметров фактическими значениями и выполняет инструкцию SQL. Каждый маркер параметра в подготовленной инструкции динамического SQL (если таковые есть) должен соответствовать своей управляющей переменной в предложении USING. При использовании маркеров Oracle имена макроподстановок не обязательно должны соответствовать именам управляющих переменных, однако их порядок в подготовленном динамическом запросе должен отвечать порядку соответствующих управляющих переменных в предложении USING.