Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Чичкань.docx
Скачиваний:
6
Добавлен:
01.05.2025
Размер:
2 Мб
Скачать
☆
      1. 13.3. Динамічний sql

Динамічний SQL – різновид програмного SQL, призначений для вбудовування SQL-операторів в текст програми мовою програмування високого рівня, допускає динамічне формування і виконання запитів під час роботи програми.

Історія виникнення динамічного SQL багато в чому пов'язана з компанією IBM, що впровадила цей потужний інструмент у свою СУБД DB2. Стандарти SQL, зокрема SQL-1, не підтримували динамічних SQL. Лише у 1992 році в стандарт SQL-2 були включені специфікації динамічного SQL. Основною концепцією динамічного SQL є наступне твердження: вбудована інструкція SQL не записується у вихідний текст програми, замість цього програма формує текст інструкції під час виконання в одній зі своїх областей даних, а потім передає сформовану інструкцію у СУБД для динамічного виконання [5].

Нагадаємо, що при використанні статичного SQL: схема реалізації мала на увазі два етапи – компіляцію програми і виконання програми. При цьому на етап компіляції лягало основне навантаження. Саме тут вирішувалися питання перевірки, розбору і оптимізації запитів, оскільки запит був заздалегідь відомий. Абсолютно вочевидь, що подібну двохетапну схему не можна реалізувати для динамічного SQL, оскільки на етапі компіляції програми запит невідомий. Тому перевірку, розбирання і оптимізацію запитів тут доводиться виконувати безпосередньо під час роботи програми. Таким чином, якщо ці операції в статичному SQL виконувалися під час компіляції один раз, то в динамічному  SQL вони виконуватимуться стільки раз для одного запиту, скільки разів він буде сформований в процесі роботи прикладної програми. Це визначає істотний недолік динамічного SQL – низьку продуктивність в порівнянні із статичним. Перевагою динамічної SQL в тому, що вона дозволяє формувати запит до бази даних під час роботи програми, реагуючи на ті або інші події, що сталися. Така можливість є життєво важливою для клієнт-серверної і триланкової архітектури, в якій структура бази даних і ділові правила мають тенденцію до зміни, що вимагає певної гнучкості при організації процесу обробки даних.

Враховуючи відносно низьку продуктивність динамічного SQL, представляється правильним, там, де тільки можливо, рекомендувати використання статичного різновиду SQL, застосовуючи апарат динамічної SQL, де це дійсно необхідно.

Динамічна SQL також повинна містити додаткових операторів (в порівнянні з інтерактивною SQL). Основні оператори динамічної SQL наводяться в наступній таблиці.

Таблиця 13.2. Основні команди динамічного SQL

EXECUTE IMMEDIATE

Негайне виконання інструкції

PREPARE

Підготовка інструкції до виконання

EXECUTE

Виконання підготовленої раніше інструкції

DESCRIBE

Спеціальна команда, що бере участь при поверненні результату виконання інструкцій динамічного SQL

DECLARE CURSOR

Різновид інструкції DECLARE CURSOR, що застосовувалася раніше в рамках статичного SQL, що містить замість запиту його ім'я (пов'язане із запитом за допомогою інструкції PREPARE)

OPEN

FETCH

CLOSE

Різновиди інструкцій для роботи з курсором в динамічному SQL

Розглянемо схему функціонування динамічного SQL (мал. 13.3). Схема передбачає одноетапне і двохетапне виконання інструкцій.

Одноетапне виконання інструкцій здійснюється командою EXECUTE IMMEDIATE.

Мал. 13.3.  Схема виконання програми із вбудованими інструкціями динамічного SQL із застосуванням одноетапної схеми

Схема виконання інструкції має на увазі:

  • динамічне формування команди SQL в строковому вигляді під час роботи програми;

  • передачу строкового вигляду інструкції в СУБД за допомогою команди EXECUTE IMMEDIATE;

  • виконання інструкції системою управління БД, що включає синтаксичний аналіз, перевірку параметрів, оптимізацію (вибір плану) і виконання цього плану.

Основні проблеми одноетапної схеми полягають в тому, що вона не дозволяє виконувати інструкції SELECT (бо немає засобів для повернення в додаток результатів запиту) і призводить до нераціональних витрат обчислювальних ресурсів (оскільки при повторному виконанні тієї ж інструкції знову буде витрачено час на всі ті ж дії по її інтерпретації і виконанню).

Двохетапне виконання інструкцій засноване на наступному міркуванні: швидше за все, команда динамічного SQL у такому вигляді, як вона поступає на виконання, виконуватиметься неодноразово. При цьому можуть мінятися якісь конкретні деталі. А це означає, що інструкцію можна параметризувати. Використання інструкцій, що параметризуються, дозволяє зробити схему виконання двохетапною, розділивши процес на "підготовку інструкції" та "виконання інструкції" (мал. 13.4).

Мал. 13.4.  Схема виконання програми зі вбудованими інструкціями динамічного SQL із застосуванням двохетапної схеми

На етапі підготовки можна здійснити синтаксичний аналіз інструкції, інтерпретувати її і підготуватися до виконання, вибравши план виконання.

На етапі виконання СУБД підставляє значення параметрів (отримані з програми) і використовує сформований раніше план виконання для досягнення результату.

При цьому реалізується ідея однократного виконання тих дій, які можна виконати один раз. Так, підготовлена один раз інструкція може бути виконана десятки разів з різними параметрами.