Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОТВЕТЫ_ФИН.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
338.29 Кб
Скачать

8. Динамічний sql. Призначення. Порівняння динамічного та статичного

SQL.

Многие задачи требуют использования динамического SQL в PL/SQL. Вот лишь некоторые из них.

1. Разработка обобщенных процедур, выполняющих стандартные действия вроде выгрузки данных в файлы.

2. Разработка универсальных процедур загрузки данных в неизвестные заранее таблицы. Мы рассмотрим использование динамического SQL для загрузки данных в таблицу.

3. Динамический вызов других PL/SQL-процедур во время выполнения.

4. Генерация условий (например, конструкции WHERE) в процессе работы на основе введенных пользователем данных. Это, пожалуй, основная причина использования динамического SQL большинством разработчиков.

5. Выполнение операторов ЯОД. Поскольку PL/SQL не разрешает включать статические операторы ЯОД в код приложения, остается использовать динамический SQL. Это позволит выполнять операторы, начинающиеся с ключевых слов CREATE, ALTER, GRANT, DROP и т.п.

Решаться перечисленные задачи будут с помощью двух средств языка PL/SQL:

 с использованием стандартного пакета DBMS_SQL. Этот пакет существует уже достаточно давно, он появился в версии 7.1. Пакет обеспечивает процедурный метод выполнения динамического SQL, аналогичный использованию функциональных интерфейсов (таких как JDBC или ODBC);

 с использованием встроенного динамического SQL (который реализуется в PL/SQL оператором EXECUTE IMMEDIATE). Это декларативный способ выполнения динамического SQL в языке PL/SQL и в большинстве случаев он синтаксически намного проще, чем использование пакета DBMS_SQL; кроме того, он обеспечивает более высокую производительность.

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

Метод Тип предложения

1. Незапросные (nonqueries), нет базовых переменных (no host variables), выполняется однократно(execute once)

2. Незапросные, известное число базовых переменных (known number host variables), выполняются один или несколько раз (execute one or more times)

3. Запросные (queries), известное число операторов SELECT и базовых переменных (known number of SELECT list items and host variables)

4. Запросные, неизвестное число операторов SELECT и базовых переменных колонок (unknown number of SELECT list items and column host variables)

9. Реалізація динамічного sql за допомогою пакета dbms_sql

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

В общем случае, процесс, использующий пакет DBMS_SQL, будет иметь

следующую структуру.

• Вызов OPEN_CURSOR для получения дескриптора курсора.

• Вызов PARSE для анализа оператора.

• Вызов BIND_VARIABLE (BIND_ARRAY) для передачи входных данных оператору.

• Если обрабатывается запрос (оператор SELECT), необходимо вызвать процедуру

DEFINE_COLUMN или DEFINE_ARRAY, чтобы указать серверу Oracle, как передавать результаты (как массивы или как скалярные величины и какой тип данных при этом использовать).

• Вызов EXECUTE для выполнения оператора.

• Если выполняется запрос, необходимо вызвать FETCH_ROWS для выборки данных.

• Если же выполняется блок кода PL/SQL или оператор ЯМД с конструкцией

RETURN, можно вызвать процедуру VARIABLE_VALUE для получения результатов (параметров типа OUT) из блока по имени.

• Вызов CLOSE_CURSOR.

Пакет DBMS_SQL необходимо использовать в следующих случаях.

1. Если заранее не известно количество или типы столбцов, с которыми придется работать. Пакет DBMS_SQL включает процедуры для описания результирующего множества. Встроенный динамический SQL не позволяет получить такое описание. При использовании встроенного динамического SQL необходимо знать характеристики результирующего множества при компиляции, если результаты необходимо обрабатывать в PL/SQL.

2. Если заранее неизвестно количество или типы связываемых переменных, с которыми придется работать. Пакет DBMS_SQL по ходу выполнения позволяет привязать с помощью процедур входные переменные к операторам. Встроенный динамический SQL требует учета количества и типов связываемых переменных на этапе компиляции.

3. Когда необходимо выбирать или вставлять тысячи строк и можно использовать обработку массивов. Пакет DBMS_SQL поддерживает обработку массивов – возможность выбрать N строк за раз, одним вызовом. Встроенный динамический SQL обычно не позволяет этого сделать, но это ограничение можно обойти, как будет показано далее.

4. Если в сеансе многократно выполняется один и тот же оператор. Пакет DBMS_SQL позволяет один раз разобрать оператор, а затем выполнять его многократно. При использовании встроенного динамического SQL мягкий разбор будет осуществляться при каждом выполнении. Такие дополнительные повторные разборы нежелательны.

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

1. Когда количество и типы столбцов, с которыми придется работать, заранее известны.

2. Когда заранее известно количество и типы связываемых переменных (можно также использовать контексты приложений, чтобы с помощью более простого встро¬енного динамического SQL выполнять операторы с заранее неизвестным коли¬чеством или типами связываемых переменных).

3. Когда необходимо выполнять операторы ЯОД.

4. Если динамически формируемые операторы будут выполняться лишь несколько раз (оптимальный вариант – однократно).

Работа с пакетом происходит по следующей схеме.

1. Строится сам текст запроса с метками для параметров. Текст запроса может быть представлен в виде строки или коллекции строк.

2. Функцией DBMS_SQL.Open_Cursor выделяется идентификатор курсора, который будет использоваться для работы с запросом. Идентификатор ссылается на внутреннюю структуру Oracle, определяющую курсор. Этот идентификатор используется процедурами пакета DBMS_SQL.

3. Выполняется разбор текста запроса DBMS_SQL.Parse.

4.Устанавливаются значения параметров запроса DBMS_SQL.Bind_Variable.

5. Если запрос возвращает данные, то определяются столбцы и буферные переменные, в которых будут размещаться возвращаемые данные. DBMS_SQL.Define_Column.

6. Запрос выполняется. DBMS_SQL.Execute.

7. Если запрос возвращает данные, то производится выборка данных из курсора и необходимая их обработка. DBMS_SQL.Fetch_Rows, DBMS_SQL.Column_Value.

8. Курсор закрывается. DBMS_SQL.Close_Cursor.

10. Алгоритм обробки даних у DBMS_SQL.