- •Вступ до баз даних. Загальна характеристика основних понять
- •1.1. Розвиток основних понять представлення даних
- •Лекція 6
- •Друга стадія концептуального проектування бд. (Моделі даних субд. Представлення концептуальної моделі засобами моделі даних субд)
- •6.1. Представлення концептуальній моделі засобами моделі даних субд
- •6.2 Типові моделі даних субд і представлення концептуальної моделі
- •6.2.1. Мережева модель даних
- •6.2.2. Ієрархічна модель даних
- •6.2.3. Реляційна модель даних
- •6.2.4. Багатовимірна модель даних
- •6.3. Засоби автоматизованого проектування концептуальної моделі
- •Лекція 6
- •Друга стадія концептуального проектування бд. (Моделі даних субд. Представлення концептуальної моделі засобами моделі даних субд)
- •6.1. Представлення концептуальній моделі засобами моделі даних субд
- •6.2 Типові моделі даних субд і представлення концептуальної моделі
- •6.2.1. Мережева модель даних
- •6.2.2. Ієрархічна модель даних
- •6.2.3. Реляційна модель даних
- •6.2.4. Багатовимірна модель даних
- •6.3. Засоби автоматизованого проектування концептуальної моделі
- •Лекція 7
- •Формалізація реляційної моделі
- •7.1. Формалізований опис відношень і схеми відношень
- •7.2. Маніпулювання даними в реляційній моделі
- •7.3. Операції реляційної алгебри
- •Лекція 8
- •Використання формального апарату для оптимізації схем відношень
- •8.1. Проблема вибору раціональних схем відношень
- •8.2. Функціональні залежності (залежності між атрибутами відношення)
- •8.3. Декомпозиція схеми відношення
- •8.4 .Вибір раціонального набору схем відношень шляхом нормалізації
- •8.5. Приклад нормалізації до 3нф
- •8.6. Цілісна частина реляційної моделі. Реалізація умови цілісності даних в сучасних субд
- •Лекція 9
- •Фізичні моделі даних (внутрішній рівень)
- •9.1. Структура пам'яті еом
- •9.2. Представлення екземпляра логічного запису
- •9.3. Організація обміну між оперативною і зовнішньою пам'яттю
- •9.4. Структури зберігання даних у зовнішній пам'яті еом
- •9.4.1. Послідовне розміщення фізичних записів
- •Пошук запису із заданим значенням ключа
- •9.4.2. Розміщення фізичних записів у вигляді спискової структури
- •Пошук запису із заданим значенням ключа
- •9.4.3. Використання індексів (індексування)
- •Пошук і читання запису із заданим значенням ключа
- •Модифікація (коректування) запису
- •Видалення запису
- •Додавання запису
- •9.4.5. Розміщення записів з використанням хешування
- •Пошук запису із заданим значенням ключа і читання
- •Модифікації запису
- •Видалення запису
- •Додавання запису
- •9.4.6. Комбіновані структури зберігання
- •Лекція 10
- •Структура сучасної субд на прикладі Microsoft sql Server 2008
- •10.1 Загальна структура субд
- •10.2. Архітектура бази даних. Логічний рівень
- •Тип даних hierarchyid
- •Просторові типи даних
- •Індекси
- •Представлення
- •Складки
- •Обмеження
- •Правила
- •Значення за замовчуванням
- •10.3. Архітектура бази даних. Фізичний рівень
- •Файли і файлові групи
- •Сторінки і екстенти
- •Сторінки файлів даних
- •Організація таблиць та індексів
- •Управління роботою з екстентами і вільним місцем
- •Відстежування вільного місця
- •Лекція 11
- •Програмне забезпечення роботи з сучасними базами даних
- •11.1. Основні завдання програмного забезпечення баз даних
- •11.2. Проблеми створення і ведення реляційних баз даних
- •11.3. Поняття мови sql і його основні частини
- •11.3.1. Історія виникнення і стандарти мови sql
- •11.3.2. Переваги мови sql
- •11.3.2. Загальна характеристика sql
- •Термінологія
- •Різновиди sql
- •Лекція 12
- •Основні оператори мови sql. Інтерактивний sql
- •12.1. Загальне уявлення про основні оператори мови sql
- •12.2 Інтерактивний режим роботи з sql (інтерактивна sql)
- •12.3. Використання мови sql для вибору інформації з таблиці
- •12.4. Використання sql для вибору інформації з декількох таблиць
- •12.5. Використання sql для вставки, редагування і видалення даних у таблицях
- •Лекція 13
- •Використання мови sql у прикладних програмах
- •13.1. Програмний (вбудований) sql
- •13.2. Статичний sql
- •13.3. Динамічний sql
- •13.4. Інтерфейси програмування додатків (api). Db‑Library, odbc, oci, jdbc
- •Протокол odbc
- •Протокол jdbc
- •Лекція 14
- •Напрями розвитку баз даних
- •Бібліотека db-Library
- •14.1. Об'єктно-орієнтований підхід до організації баз даних
- •Об'єктно-орієнтоване програмування
- •Об'єктно-орієнтовані бази даних
- •Об'єктно-реляційні субд
- •14.2. Розподілені бази даних
- •14.3. Сховища даних
- •Основи криптології
Лекція 13
Використання мови sql у прикладних програмах
У лекції розглядаються різні технології формування запитів мовою SQL в прикладних програмах (статичне формування запиту, динамічне формування запиту, використання бібліотек)
Мета лекції: показати основні можливості формування запитів до бази даних з прикладних програм.
13.1. Програмний (вбудований) sql
Основна робота з базою даних проводиться з використанням прикладних програм, з яких і йдуть запити до баз даних. В цьому випадку інтерактивний режим роботи не може бути використаний, текст SQL-запиту має бути або включений у прикладну програму (якщо запит повністю визначений заздалегідь), або формуватися в процесі роботи прикладної програми.
Програмний SQL призначений для того, щоб вбудовувати SQL‑запити в прикладну програму, написану на одній з мов програмування. При цьому виникають такі питання:
компілятор з алгоритмічної мови повинен мати можливість виділення в тексті прикладної програми послідовність операторів SQL.
компілятор повинен об'єднувати можливості мови програмування високого рівня і можливості SQL (запити мовою, близької до природної).
Вирішення цих проблем частково описане в стандарті SQL.
Розглянемо алгоритм виконання SQL-запитів в інтерактивному режимі роботи. Легко бачити, що користувач вимушений чекати результатів виконання запиту протягом всього часу роботи реалізації SQL-запиту. Якщо через деякий час користувачеві знову потрібно буде виконати той же самий запит, СУБД знову виконає ті ж самі дії, що і при попередньому зверненні. Явно тут деяка недосконалість механізму:
одні і ті ж етапи виконуються кожного разу заново для однакових запитів;
СУБД не може обробляти інтерактивні запити з випередженням.
Вирішення подібних проблем очевидне – частину дій з обробки запиту необхідно виконувати один раз, зберігати результат якимось чином, а потім використовувати стільки раз, скільки необхідно. Ця ідея є однією з основних ідей програмної SQL. Таким чином, програмна SQL дозволяє:
використовувати оператори інтерактивної SQL у тексті програми мовою програмування високого рівня;
разом з операторами інтерактивної SQL використовувати нові спеціальні конструкції, доповнюючи SQL і збільшувати її можливості;
для передачі параметрів у запит використовувати в тексті запиту змінні, оголошені в програмі;
для повернення в програму результатів запиту використовувати спеціальні конструкції, відсутні в інтерактивній SQL;
здійснювати компіляцію запитів спільно з програмою, забезпечуючи згодом погоджену роботу програми і СУБД. Заздалегідь (на етапі компіляції) виконувати дії з аналізу і оптимізації запитів, економлячи час, що витрачається на етапі виконання програми.
На цей момент використовуються три варіанти вбудовування запитів мовою SQL у прикладну програму (програмного SQL): статичний SQL, динамічний SQL і метод, заснований на різних інтерфейсах програмування додатків (API). Розглянемо відповідні варіанти.
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.
