Книги-online
ОГЛАВЛЕНИЕ.
1. Обязанности администратора базы данных (АБД)
2. Подключение в режиме INTERNAL
3. Утилиты АБД (Import, Export, Loader)
4. Пользователи базы данных и схемы
5. Табличные пространства и файлы данных
6. Схемы и объекты схемы
7. Блоки данных, экстенты и сегменты
8. Структуры памяти и процессы
9. Пример работы Oracle
10. Журнал Повторений
11. Транзакция
12. Обеспечение защиты базы данных
13. Представления словаря данных
14. Привилегии (Grant, role)
15. Управление пользователями базы данных
16. Аудит базы данных
17. Обеспечение целостности базы данных
18. Создание базы данных. (файлы параметров)
19. Запуск и останов базы данных
20. Различные режимы работы базы данных
21. Резервное копирование базы данных
22. Динамический SQL
23. Объектно-ориентированные Базы Данных
22. Динамический SQL
Динамический SQL в Oracle
Описанный в стандарте SQL набор операторов SQL
предназначен для встраивания в программу на обычном языке программирования.
Поэтому в этом наборе перемешаны операторы "истинного " реляционного
языка запросов (например оператор удаления из таблицы части строк,
удовлетворяющих заданному условию) и операторы работы с курсорами, позволяющими
обеспечить построчный доступ к таблице-результату запроса.
В диалоговом режиме набор операторов SQL и их синтаксис
должен быть несколько другим. Весь вопрос состоит в том, как реализовывать
такую диалоговую программу. Правила встраивания стандартного SQL в программу на
обычном языке программирования предусматривают, что вся информация, касающаяся
операторов SQL, известна (за исключением значений переменных, используемых в
качестве констант в операторах SQL). Не предусмотрены стандартные средства
компиляции с последующим выполнением операторов, которые становятся известными
только во время выполнения. Поэтому, опираясь только на стандарт, невозможно
реализовать диалоговый монитор взаимодействия с БД на языке SQL или другую
прикладную программу, в которой текст операторов SQL возникает во время
выполнения, т. е. фактически так или иначе стандарт необходимо расширять.
Один из возможных путей расширения состоит в использовании
специальной группы операторов, обеспечивающих динамическую компиляцию (во время
выполнения прикладной программы) базового подмножества операторов SQL и
поддерживающих их корректное выполнение. В дополнительный набор операторов, поддерживающих
динамическую компиляцию базовых операторов SQL, входят операторы: PREPARE,
DESCRIBE и EXECUTE.
Оператор подготовки
Во время выполнения оператора PREPARE символьная строка,
содержащаяся в host-string-variable, передается компилятору SQL, который
обрабатывает таким же образом, как если бы получил в статике. Построенный при
выполнении оператора PREPARE код остается действующим до конца транзакции или
до повторного выполнения данного оператора PREPARE в пределах этой же
транзакции.
Оператор получения описания подготовленного оператора
Оператор DESCRIBE предназначен для того, чтобы определить
тип ранее подготовленного оператора, узнать количество и типы формальных
параметров(если они есть) и количество и типы столбцов результирующей таблицы,
если подготовленный оператор является оператором выборки (SELECT). Действие
оператора DESCRIBE состоит в том, что в указанную область памяти прикладной программы
(структура этой области фиксирована и известна пользователям)помещается информация,
характеризующая ранее подготовленный оператор с заданным именем.
Оператор выполнения подготовленного оператора
Оператор EXECUTE служит для выполнения ранее
подготовленного оператора SQL типа "N" (не требующего применения
курсора) или для совмещенной подготовки и выполнения такого оператора.
Для выполнения подготовленного оператора служит первый
вариант оператора EXECUTE. Число и типы фактических параметров должны
соответствовать числу и типам формальных параметров подготовленного оператора.
Работа с динамическими операторами SQL через курсоры
Для использования таких операторов используется расширение
механизма курсоров стандарта SQL. Во-первых, при определении курсора можно
указывать не только литеральную спецификацию курсора, но и имя оператора,
вводимое с помощью оператора PREPARE (в этом случае оператор PREPARE должен
текстуально находиться выше оператора DECLARE). Тем самым полный синтаксис
оператора DECLARE становится следующим:
<declare cursor> ::=
DECLARE <cursor name> CURSOR
FOR { <cursor specification> |
<statement-name> }
Далее, поскольку для такого курсора в статике неизвестна
информация о входных и выходных переменных включающей программы, то
используется другая форма операторов OPEN и FETCH.
Полный синтаксис этих операторов становится следующим:
<open statement> ::=
OPEN <cursor name>
[USING { <host-vars-list> |
DESCRIPTOR <descr-name> }]
<fetch statement> ::=
FETCH <cursor name>
{ INTO <fetch target list> |
USING <host-vars-list> |
USING DESCRIPTOR <descr-name> }
Как видно, предлагается два способа задания фактических
входных и выходных параметров: прямое с указанием в операторах OPEN и/или FETCH
списков имен переменных включающей программы и косвенное, когда число
параметров и их адреса сообщаются через дополнительную структуру-дескриптор.
Первый способ предлагается использовать для работы с
операторами выборки, для которых фиксирован набор формальных входных и выходных
параметров.
Второй способ работы с динамически откомпилированными
операторами, требующими использования курсоров, состоит в использовании
дескрипторов динамически формируемых списков параметров.