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

      2. Використання мови sql у прикладних програмах

У лекції розглядаються різні технології формування запитів мовою SQL в прикладних програмах (статичне формування запиту, динамічне формування запиту, використання бібліотек)

Мета лекції: показати основні можливості формування запитів до бази даних з прикладних програм.

      1. 13.1. Програмний (вбудований) sql

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

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

  • компілятор з алгоритмічної мови повинен мати можливість виділення в тексті прикладної програми послідовність операторів SQL.

  • компілятор повинен об'єднувати можливості мови програмування високого рівня і можливості SQL (запити мовою, близької до природної).

Вирішення цих проблем частково описане в стандарті SQL.

Розглянемо алгоритм виконання SQL-запитів в інтерактивному режимі роботи. Легко бачити, що користувач вимушений чекати результатів виконання запиту протягом всього часу роботи реалізації SQL-запиту. Якщо через деякий час користувачеві знову потрібно буде виконати той же самий запит, СУБД знову виконає ті ж самі дії, що і при попередньому зверненні. Явно тут деяка недосконалість механізму:

  • одні і ті ж етапи виконуються кожного разу заново для однакових запитів;

  • СУБД не може обробляти інтерактивні запити з випередженням.

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

  • використовувати оператори інтерактивної SQL у тексті програми мовою програмування високого рівня;

  • разом з операторами інтерактивної SQL використовувати нові спеціальні конструкції, доповнюючи SQL і збільшувати її можливості;

  • для передачі параметрів у запит використовувати в тексті запиту змінні, оголошені в програмі;

  • для повернення в програму результатів запиту використовувати спеціальні конструкції, відсутні в інтерактивній SQL;

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

На цей момент використовуються три варіанти вбудовування запитів мовою SQL у прикладну програму (програмного SQL): статичний SQL, динамічний SQL і метод, заснований на різних інтерфейсах програмування додатків (API). Розглянемо відповідні варіанти.

      1. 13.2. Статичний sql

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

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

Розглянемо два основні етапи, пов'язаних з роботою статичного SQL, – компіляція програми і робота (виконання) програми.

Схема компіляції і зібрання програми виглядає таким чином (мал. 13.1):

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

  • Замість інструкцій вбудованої SQL препроцесор підставляє виклики спеціальних функцій СУБД. Бібліотеки таких функцій для зв'язку з мовами програмування існують для всіх поширених серверних СУБД. Варто особливо відзначити, що ці бібліотеки мають "закритий" інтерфейс, тобто розробники бібліотеки можуть міняти його на свій розсуд, відповідно відновивши препроцесор. Усе це говорить про те, що програміст не повинен втручатися в цей процес.

  • Самі інструкції SQL препроцесор виділяє в окремий файл.

  • Програма поступає на вхід звичайного компілятора мови програмування, після чого виходять об'єктні модулі. Далі ці об'єктні модулі разом з бібліотеками СУБД збираються в один виконуваний модуль – додаток.

  • Разом з цими операціями відбувається робота з файлом, що містить SQL-інструкції. У літературі цей модуль часто носить назву "Модуль запитів до бази даних" (Database Request Module, DBRM) [1]. Обробку цього модуля здійснює спеціальна утиліта, яка зазвичай носить назву BIND. Для кожної інструкції SQL утиліта виконує наступні дії:

    • здійснює синтаксичний аналіз запиту (перевіряє, чи є запит коректним);

    • перевіряє, чи існують у базі даних ті об'єкти, на які посилається запит;

    • вибирає, яким чином здійснювати виконання запиту – план виконання запиту;

  • Всі плани виконання запитів зберігаються в СУБД для подальшого використання.

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

Схема виконання програми виглядає таким чином (мал. 13.2.):

Програма запускається на виконання звичайним способом. При необхідності виконати запит програмою здійснюється виклик спеціальної функції СУБД, яка відшуковує вже сформований раніше план виконання запиту. СУБД виконує запит відповідно до вибраного плану. Результат виконання запиту надходить додатку.

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

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

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

EXEC SQL

Специфікатор, який вказує що наступна за ним інструкція є інструкцією вбудованої SQL

;

У мові C – ознака закінчення інструкції вбудованої SQL

DECLARE TABLE

Оголошує таблицю, яка потім використовуватиметься в інструкціях вбудованої SQL

SQLCODE

Змінна для обробки помилок

SQLSTATE

Змінна для обробки помилок

GET DIAGNOSTICS

Інструкція для обробки помилок

WHENEVER

SQLERROR

SQLWARNING

NOT FOUND

GOTO

CONTINUE

Набір спільно використовуваних інструкцій для спрощення обробки помилок

BEGIN DECLARE SECTION

END DECLARE SECTION

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

INTO

Використовується в операторові SELECT для вказівки змінній, в яку необхідно помістити результат виконання запиту

DECLARE CURSOR

Курсор – спеціальний інструмент, призначений для обробки результатів запиту, що містять більше одного рядка. Робота з курсором схожа на роботу з файлами. Ця інструкція служить для створення курсору і пов’язування його з конкретним запитом

OPEN

Команда, що відкриває курсор і спонукаюча СУБД почати виконання запит. Встановлює курсор перед першим рядком результату запиту

FETCH

Команда, що переміщає покажчик поточного рядка (курсор) на наступний рядок. У деяких СУБД і стандарті SQL-92 реалізовані різні форми команди FETCH, що переміщають курсор на довільний рядок результатів запиту

CLOSE

Закриває курсор і припиняє доступ до результатів запиту

Використання описаної вище схеми компіляції/зборки/виконання програми дозволяє:

  • використовувати SQL спільно з програмою мовою програмування високого рівня;

  • заздалегідь здійснювати перевірку синтаксису запитів і оптимізацію їх виконання (вибір плану). Зрозуміло, що перевірка синтаксису виконується швидко, але вибір плану виконання – вельми трудомістка процедура. Той факт, що вона виконується один раз на етапі компіляції, дозволяє говорити про істотне зменшення накладних витрат.

Проте статичний різновид програмного SQL має деякі істотні обмеження. Так, змінні в запитах можуть використовуватися лише в тих місцях, де в запитах зазвичай стоять константи. Наприклад, не можна задавати ім'я таблиці, з якої проводиться вибірка, а також назви стовпців, як параметр. У зв'язку з цим при використанні статичного варіанту вкладеного (програмного) SQL необхідно на етапі написання програми точно знати склад запитів, які необхідно буде виконувати в прикладній програмі. У багатьох випадках це обмеження є істотним. Для його усунення був введений новий різновид програмного SQL – динамічний SQL. Розглянемо коротко основні ідеї динамічного SQL.