Деякі риси SQL/92 і SQL-3 b> p>
Оператор виділення пам'яті під
дескриптор
:: = ALLOCATE DESCRIPTOR [WITH MAX]:: =:: = (]:: = GLOBAL | LOCAL:: = ((
Коментар: p>
Дескриптор, це динамічно виділяється частина пам'яті прикладної програми, що служить для
прийняття інформації про результат або параметрах динамічно підготовленого оператора SQL або завдання параметрів такого оператора. Сенс того, що для
виділення пам'яті використовується оператор SQL, а не просто стандартна функція alloc або яка-небудь інша функція динамічного запиту пам'яті, полягає в
те, що прикладна програма не знає структури дескриптора і навіть його адреси. Це дозволяє не прив'язувати SQL до особливостей будь-якої системи
програмування, чи ОС. Всі обміни інформацією між власне прикладною програмою і дескриптора проводяться також за допомогою спеціальних операторів
SQL (GET і SET, див. нижче). p>
Друге питання: навіщо взагалі виділяти пам'ять під дескриптори динамічно. Це потрібно
тому, що в загальному випадку прикладна програма, що використовує динамічний SQL, не знає в статиці кількість одночасно діючих динамічних операторів SQL,
опис яких може знадобитися. З цим же пов'язане те, що ім'я дескриптора може задаватися як літеральной рядком символів, так і через строкову
змінну включає мови, тобто його можна генерувати під час виконання програми. p>
У операторі ALLOCATE DESCRIPTOR, крім іншого, може зазначатися кількість описових
елементів, на яку він розрахований. Якщо, наприклад, при виділенні пам'яті під дескриптор у роздiлi WITH MAX вказано ціле позитивне число N, а потім
дескриптор використовується для опису M (M> N) елементів (наприклад, M стовпців результату запиту), то це призводить до виникнення виняткової ситуації. p>
Оператор звільнення пам'яті
з-під дескриптора
:: = DEALLOCATE DESCRIPTOR
Коментар: p>
Виконання цього оператора призводить до звільнення пам'яті з-під раніше виділеного
дескриптора. Після цього використання імені дескриптора незаконно в будь-якому операторі, крім ALLOCATE DESCRIPTOR. p>
Оператор одержання інформації
з області дескриптора SQL
:: = GET DESCRIPTOR:: = (VALUE ((}...]:: = COUNT:: =:: =:: =:: =:: = TYPE (LENGHT (OCTET_LENGHT (RETURNED_LENGHT (RETURNED_OCTET_LENGHT (PRECISION (SCALE ( DATETIME_INTERVAL_CODE (DATATIME_INTERVAL_PRECISION (NULLABLE (INDICATOR (DATA (NAME (UNNAMED (COLLATION_CATALOG (COLLATION_SCHEMA (COLLATION_NAME (CHARACTER_SET_CATALOG (CHARACTER_SET_SCHEMA (CHARACTER_SET_NAME:: = (
Коментар: p>
Оператор GET DESCRIPTOR служить для вибірки описової інформації, раніше, розміщеної в
дескриптор за допомогою оператора DESCRIBE. За одне виконання оператора можна отримати або число заповнених елементів дескриптора (COUNT), або інформацію,
що міститься в одному із заповнених елементів. p>
Оператор установки дескриптора
:: = SET DESCRIPTOR:: = (VALUE [(}...]:: = COUNT:: =:: =:: =:: =
Коментар: p>
Оператор SET DESCRIPTOR служить для заповнення елементів дескриптора з метою його
використання у розділі USING. За одне виконання оператора можна помістити значення в полі COUNT (число заповнених елементів), або частково або
повністю сформувати один елемент дескриптора. p>
Оператор підготовки
:: = PREPARE FROM:: =:: = | | | |:: = | | | | | |:: =:: =:: =:: =:: =:: = |:: = [scope option] :: = [] []:: = FOR (READ ONLY | UPDATE [OF]):: = |:: = SELECT []:: = DISTINCT | ALL
Коментар: p>
Оператор PREPARE викликає компіляцію і побудова плану виконання заданого в текстовій
формі оператора SQL. Після успішного виконання оператора PREPARE з підготовленим оператором зв'язується вказане (літерально чи опосередковано) ім'я
цього оператора, яке потім може бути використано в операторах DESCRIBE, EXECUTE, OPEN CURSOR, ALLOCATE CURSOR і DEALLOCATE PREPARE. Цей зв'язок
зберігається до явного виконання оператора DEALLOCATE PREPARE. p>
Оператор відмови від
підготовленого оператора
:: = DEALLOCATE PREPARE
Коментар: p>
Виконання цього оператора призводить до того, що раніше підготовлений оператор SQL,
пов'язаний з вказаним ім'ям оператора, ліквідується, і, відповідно, ім'я оператора стає невизначеним. Якщо підготовлений оператор був
оператором вибірки, і до моменту виконання оператора DEALLOCATE існував відкритий курсор, пов'язаний з ім'ям підготовленого оператора, то оператор
DEALLOCATE повертає код помилки. Якщо ж для підготовленого оператора вибірки існував Невідкритий курсор, утворений за допомогою оператора ALLOCATE
CURSOR, то цей курсор ліквідується. Якщо курсор оголошувався оператором DECLARE CURSOR, то такий курсор переходить в стан, що існував до виконання
оператора PREPARE. Якщо з курсором був пов'язаний підготовлений оператор (динамічний DELETE або UPDATE), то для цих операторів виконується неявний
оператор DEALLOCATE. p>
Оператор запиту опису
підготовленого оператора
:: = |:: = DESCRIBE INPUT:: = DESCRIBE [OUTPUT]:: = |:: = (USING | INTO) [(}...]:: =:: = (USING | INTO) SQL DESCRIPTOR:: = |:: = []:: = [INDICATOR]:: = []:: = [INDICATOR]
Коментар: p>
При виконанні оператора DESCRIBE відбувається заповнення вказаного в операторі
дескриптора інформацією, яка описує або результат заздалегідь підготовленого оператора SQL (якщо це оператор вибірки), або кількість і типи параметрів
підготовленого оператора. У тут належить писати USING SQL DESCRIPTOR. p>
Оператор виконання
підготовленого оператора
:: = EXECUTE (] (]:: =:: =
Коментар: p>
Оператор EXECUTE може бути застосований до будь-якого раніше підготовленому оператору SQL, крім
. Якщо це оператор, то оператор EXECUTE повинен містити розділ з ключовим словом INTO. У будь-якому випадку число фактичних параметрів, що задаються через розділи using, повинна відповідати числу
формальних параметрів, визначених в підготовленому оператора SQL. p>
Оператор підготовки з
негайним виконанням
:: = EXECUTE IMMEDIATE
Коментар: p>
При виконанні оператора EXECUTE IMMEDIATE проводиться підготовка та негайне
виконання заданого у текстовій формі оператора SQL. При цьому підготовлюваний оператор не повинен бути оператором вибірки, не повинен містити формальних
параметрів та коментарів. p>
Оператор оголошення курсору над
динамічно підготовленим оператором вибірки
:: = DECLARE [INSENSITIVE] [SCROLL] CURSOR FOR
Коментар: p>
Як визначається в новому стандарті, для всіх операторів DECLARE CURSOR, курсори
фактично створюються при початку транзакції і знищуються при її завершенні. Зауважимо, що в цьому операторі і --
прямо задані ідентифікатори. p>
Оператор визначення курсору
над динамічно підготовленим оператором вибірки
:: = ALLOCATE [INSENSITIVE] [SCROLL] CURSOR FOR:: = (]
Коментар: p>
Курсори, що визначаються за допомогою оператора ALLOCATE CURSOR, фактично створюються при
виконання такого оператора і знищуються при виконанні оператора DEALLOCATE PREPARE або під час завершення транзакції. У цьому операторі імена курсору і
підготовленого оператора SQL можуть здаватися не тільки в літеральной формі, а й через змінні. відноситься до області видимості імен: в рамках поточного модуля або в межах поточної сесії. p>
Оператор відкриття курсору,
пов'язаного з динамічно підготовленим оператором вибірки
:: = OPEN []
Коментар: p>
По суті, оператор відкриття курсору, пов'язаного з динамічно підготовленим оператором SQL, відрізняється від статичного випадку тільки можливою наявністю
розділу using, в якому задаються фактичні параметри оператора вибірки. Крім того, ім'я курсору може задаватися через змінну. p>
Оператор читання строки по
курсору, пов'язаному з динамічно підготовленим оператором вибірки
:: = FETCH [[] FROM]
Коментар: p>
По суті, оператор читання по курсору, пов'язаному з динамічно підготовленим оператором SQL, відрізняється від статичного випадку тільки можливою наявністю
розділу using, в якому задається розміщення значень поточного рядка результуючої таблиці. Крім того, ім'я курсору може задаватися через
змінну. p>
Оператор закриття курсору,
пов'язаного з динамічно підготовленим оператором вибірки
:: = CLOSE
Коментар: p>
По суті, оператор закриття курсору, пов'язаного з динамічно підготовленим оператором SQL, відрізняється від статичного випадку тільки тим, що ім'я курсору
може задаватися через змінну p>
Оператор позиційного видалення
по курсору, пов'язаному з динамічно підготовленим оператором вибірки
:: = DELETE FROM WHERE CURRENT OF
Коментар: p>
По суті, оператор позиційного видалення по курсору, пов'язаному з динамічно підготовленим оператором SQL, відрізняється від статичного випадку тільки тим,
що ім'я курсору може задаватися через змінну. p>
Оператор позиційної
модифікації по курсору, пов'язаному з динамічно підготовленим оператором
вибірки
:: = UPDATE SET [(}...] WHERE CURRENT OF
Коментар: p>
По суті, оператор позиційної модифікації по курсору, пов'язаному з динамічно
підготовленим оператором SQL, відрізняється від статичного випадку тільки тим, що ім'я курсору може задаватися через змінну. p>
Підготовлюваний оператор
позиційного видалення
:: = DELETE [FROM] WHERE CURRENT OF
Коментар: p>
Основний сенс появи цього і наступного операторів полягає в тому, що поєднання
курсору, визначеного на динамічно підготовленому операторі вибірки, і статично задаються операторів видалення та модифікації з цього курсору,
виглядає досить безглуздо. Тому в стандарті з'явилися спільні готуються позиційні оператори видалення та вставки. Природно, що
виконуватися вони повинні за допомогою оператора EXECUTE. p>
Підготовлюваний оператор
позиційної модифікації
:: = UPDATE [] SET [(}...] WHERE CURRENT OF
Коментар: p>
Дивись попередній пункт. p>
Якщо уважно порівнювати засоби динамічного SQL СУБД Oracle V.6 і стандарту
SQL/92, то видно, що Oracle практично вкладається в стандарт, якщо не вважати невеликих синтаксичних відмінностей і (що істотно більш важливо)
різного стилю роботи з дескриптора. Думається, що приблизно така ж ситуація має місце в інших СУБД, які підтримують динамічний SQL. P>
Зведення нових можливостей SQL-3
У стандарті SQL/92 в порівнянні зі стандартом SQL/89 мову був розширений головним
чином кількісно, хоча навіть цих кількісних розширень виявилося достатньо для того, щоб стандарт SQL/92 не вдалося повністю реалізувати до
Дотепер у більшості комерційних СУБД. Оскільки SQL/92 не задовольняв значної частини претензій, історично що пред'являються до мови SQL, був
сформований новий комітет, який повинен виробити стандарт мови з якісними розширеннями. Мова SQL-3 поки не сформований повністю, багато
аспекти продовжують обговорюватися. Тому до наведеної тут зведенні можливостей потрібно ставитися як до суто попередньої. p>
17.19.1. Типи
даних
Набір вбудованих типів даних передбачається розширити типами BOOLEAN і ENUMERATED.
Хоча через підтримки невизначених значень мови SQL властиво застосування тризначної логіки, тип BOOLEAN містить тільки два можливих
значення true і false. Для представлення значення unknown рекомендується використовувати NULL, що, звичайно, не цілком природно. Перераховуються тип
ENUMERATED володіє властивостями, подібними властивостями перелічуваних типів в мовах програмування. p>
Розширені можливості роботи з невизначеними значеннями. З'явився новий оператор CREATE
NULL CLASS, що дозволяє ввести іменований набір іменованих невизначених значень. При визначенні домену можна явно вказати ім'я класу невизначених
значень, поява яких допустимо у стовпцях, пов'язаних з цим доменом. Сенс кожного невизначеного значення інтерпретується на рівні користувачів.
p>
Передбачається включення в мову можливості використання певних користувачами типів
даних. Мабуть, будуть матися можливості визначення абстрактних типів даних з довільно складною внутрішньою структурою на основі таких традиційних
можливостей агрегування і структуризації як LIST, ARRAY, SET, MULTISET і TUPLE, а також можливості визначення об'єктних типів з відповідними
методами в стилі об'єктно-орієнтованого підходу. p>
З'являється можливість використання принципів наслідування властивостей існуючої таблиці
(супертабліци) при визначенні нової таблиці (підтаблиці). Підтаблиці успадковує від супертабліци всі визначення стовпців і первинного ключа. Інша можливість
- Створити таблицю, "подібну" існує в тому сенсі, що в новій таблиці успадковуються визначення деяких стовпців існуючої таблиці. p>
17.19.2.
Деякі інші властивості SQL-3
Однією з проблем реалізації мови SQL завжди була проблема розпізнавання "змінності" з'єднань. Як відомо, якщо подання включає
з'єднання загального вигляду, то теоретично неможливо визначити, чи можна однозначно інтерпретувати операції оновлення такого подання. Однак
існує кілька важливих класів сполук, які свідомо є змінними. У SQL-3 передбачається виділити ці класи за допомогою спеціальних
синтаксичних конструкцій. p>
Нарешті з'являється можливість визначення тригерів як комбінації специфікацій
події і дії. Дія визначається як SQL-процедура, в якій можуть використовуватися як оператори SQL, так і ряд керуючих конструкцій. На самом
справі, цей механізм дуже близький до того, що реалізований в Oracle V.7. p>
Що стосується управління транзакціями, то відбувається повернення до старої ідеї System R
про можливість установки в транзакції точок збереження (savepoints). У операторі ROLLBACK можна вказати ідентифікатор раніше встановленої точки
збереження, і тоді буде зроблений відкат транзакції не до її початку, а до цієї точки збереження. p>
Як видно, можна очікувати наявності в SQL-3 багатьох цікавих і корисних можливостей.
Однак навіть проміжні проекти стандарту включають майже в два рази більше сторінок, ніж стандарт SQL/92. Тому важко очікувати швидкої реалізації цього
стандарту після його прийняття (а багато хто взагалі сумніваються, що цей стандарт буде коли-небудь реалізований). p>