ВПРОВАДЖЕННЯ ОПЕРАТОРІВ SQL

У більшості продуктів SQL оператори мови SQL можуть виконуватися як безпосередньо (Тобто інтерактивно, з підключеного терміналу), так і у вигляді частини прикладної програми (тобто оператори SQL можуть бути впровадженими, а значить, можуть змішуватися з операторами базової мови цієї програми) Програми, що використовують впроваджені оператори SQL, можуть бути написані на багатьох базові мови стандарт SQL включає підтримку для Ada, С, COBOL, Fortran, Java, M (раніше відомого як MUMPS), Pascal і PL / I Розглянемо особливості технології впровадження операторів SQL більш докладно

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

Перш ніж почати обговорення конкретних впроваджуваних операторів SQL, необхідно обговорити деякі деталі Більшість з них ілюструється фрагментом програми, представленим на рис 43 (Для закріплення наших уявлень будемо вважати, що базовою мовою є PL / I Більшість наведених прикладів транслюється на інші базові мови лише з незначними змінами)

Розглянемо цей фрагмент програми

1&nbsp Впроваджені оператори SQL предваряются інструкцією EXEC SQL, так що їх лег ко відрізнити від інших операторів базової мови, і закінчуються спеціальним завершальним символом (Для мови PL / I таким є крапка з комою ;”)

2&nbsp Що Здійснюється оператор SQL (Далі і до кінця цього розділу уточнююче слово поза дрену зазвичай не застосовуватиметься) може бути в програмі всюди, де можуть знаходитися виконувані оператори базової мови Зверніть увагу на уточ няющее слово виконуваний: на відміну від інтерактивного режиму використання мови SQL, режим впровадження операторів SQL увазі включення в про граму окремих операторів SQL, які є чисто декларативними, а не виконуваними Наприклад, оператор DECLARE CURSOR – це не що виконується оператор (подробиці наводяться в розділі Операції, в яких використовуються курсори) такими не є і оператори BEGIN і END DECLARE SECTION (див п 5 цього списку), а також оператор WHENEVER (РМ П 9)

EXEC SQL BEGIN DECLARE SECTION DCL SQLSTATE CHAR(5) DCL P# CHAR(6) DCL WEIGHT FIXED DECIMAL(5,1)

EXEC SQL END DECLARE SECTION

P # = P2; / * Розглядається як приклад * / EXEC SQL SELECT PWEIGHT

INTO :WEIGHT FROM P

WHERE PP# = P# ( :P# ) IF SQLSTATE = 00000 THEN ..

; / * WEIGHT значення, отримане шляхом вибірки * / ELSE ..; / * Виникло деякий виняток * /

Рис 43 Фрагмент програми на мові PL / I із впровадженими операторами мови SQL

3 Оператори SQL можуть включати посилання на базові змінні (Тобто змінні базової мови) Подібні посилання повинні мати префікс у вигляді двокрапки, дозволяє відрізнити їх від імен стовпців таблиць SQL Базові змінні можуть застосовуватися у впроваджених операторах SQL скрізь, де в інтерактивному мовою SQL можуть використовуватися літерали Вони можуть також знаходитися в реченні INTO операторів SELECT (див п 4) і FETCH (подробиці – у розділі Операції, в яких використовуються курсори), визначальному результуючі змінні для розміщення результатів вибірки даних

4 Зверніть увагу на конструкцію INTO оператора SELECT, представленого на рис 43 Призначення цієї конструкції (як тільки що відзначалося) – вказати ре зультірующіе (цільові) змінні, в яких будуть повернуті вибрані зна чення Кожна /-Я цільова змінна, зазначена в пропозиції INTO, соответству ет /-му витягується значенню, зазначеному в списку вибірки пропозиції SELECT

5 Всі базові змінні, на які посилаються впроваджені оператори SQL, по винні бути визначені в розділі оголошень впровадженого мови SQL, який ограни чивается операторамиBEGIN DECLARE SECTION І END DECLARE SECTION

(В PL / I для цього використовується операторDCL)

6 Кожна програма, що містить впроваджені оператори SQL, повинна включати ба зовую змінну з імям SQLSTATE Після виконання будь-якого присутствую ного в програмі оператора SQL в цю змінну повертається код стану Зокрема, код стану 00000 означає, що оператор був виконаний успішно, а код стану 02000 – що оператор був виконаний, але ніяких задовольняю щих запитом даних знайдено не було (інші значення вказані в [423]) Таким чином, виконання в програмі кожного оператора SQL має завершуватися перевіркою значення змінної SQLSTATE і, якщо це значення буде відрізнятися від очікуваного, повинні вживатися відповідні дії На практи ке, однак, така перевірка зазвичай виконується неявно (Див п 9)

7 Кожна змінна базової мови повинна мати тип даних, відповідний значенням, для зберігання яких ця змінна використовується Зокрема, базова змінна, яка використовується як цільовий (наприклад, для зберігання результатів операції SELECT), повинна мати тип даних, сумісний з типом виразу, значення якого присвоюється цієї цільової базової змінної Аналогічно, якщо базова змінна служить джерелом (наприклад, для опера ції INSERT), вона повинна мати тип даних, сумісний з типом SQL того стовпця, якому присвоюється значення з цього джерела Але ця тема є ється набагато складнішою порівняно з відомостями, наведеними у главі, тому вона тут не розглядається (принаймні, досить під робно), а її подальше обговорення буде продовжено в розділі 5, розділ 57

8 Базові змінні для стовпців таблиць SQL можуть мати ті ж імена, що й імена відповідних стовпців

9 Як уже згадувалося, виконання кожного оператора SQL, в принципі, має супроводжуватися перевіркою значення, що повертається в змінній SQLSTATE Для спрощення цього процесу призначений оператор WHENEVER, який має наступний синтаксис

EXEC SQL WHENEVER &ltcondition&gt &ltaction&gt },

Тут параметр &ltcondi tion&gt (Умова) може приймати значення NOT FOUND (дані не знайдені), SQLWARNING (попереджувальне повідомлення SQL) і SQLEXCEPTION (виняткова ситуація SQL) (інші умови включають певні значення SQLSTATE і фіксують порушення заданих обмежень цілісності), а параметр&ltaction&gt— це або оператор CONTINUE (продовжити), або оператор GO TO (перейти до мітці) Оператор WHENEVER не є виконуваним це просто директива для компілятора SQL Наявність в програмі виразу WHENEVER  &ltcondition&gt  GO  TO  &ltlabel&gt&quot  призведе до того, що компілятор помістить оператор IF &ltcondition&gt GO TO &ltlabel&gt  END IF після кожного зустрівся йому виконуваного оператора SQL Однак, зустрівши вираз WHENEVER&ltcondition&gt  CONTINUE , компілятор SQL не вставляти в програму ніяких операторів, і отже, програміст повинен буде вставити необхідні оператори вручну Умови NOT FOUND, SQLWARNING і SQLEXCEPTION визначені, як описано нижче

■ NOT FOUND показує, що не знайдені дані, відповідні оператору

значення SQLSTATE = 02ххх

■ SQLWARNING означає, що виникла незначна помилка значення

SQLSTATE = Olxxx

■ SQLEXCEPTION означає, що виникла серйозна помилка (виняткова сі туация) значення SQLSTATE наведені в [423]

Кожен оператор WHENEVER (для певної умови), зустрінутий компілятором при послідовному перегляді тексту програми, скасовує попередній (для цього умови)

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

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

Операції, в яких не використовуються курсори

Нижче перераховані оператори маніпулювання даними, для яких не потрібне використання курсорів

■ Однорядковий оператор SELECT

■&nbsp&nbsp INSERT

■ UPDATE (крім форми CURRENT – див наступний підрозділ)

■ DELETE (також крім форми CURRENT – див наступний підрозділ)

Розглянемо приклади кожного з цих операторів

Однорядковий оператор SELECT Отримати статус і назву міста для постачальника, номер якого заданий в базовій змінної GlVENS #

EXEC SQL SELECT STATUS, CITY INTO :RANK, :TOWN FROM S WHERE S# = S# ( :GIVENS# )

;

Термін однорядковий оператор SELECT використовується для позначення виразу SELECT, значенням якого буде таблиця, яка містить не більш одного рядка У даному прикладі, якщо в таблиці S існує одна і тільки одна рядок, що відповідає заданому умові в конструкції WHERE, значення стовпців STATUS і CITY з цього рядка відповідно до запиту будуть присвоєні базовим змінним RANK і CITY, а змінної SQLSTATE буде присвоєно значення 00000 Якщо в таблиці S немає ні одного рядка, що відповідає заданій умові WHERE, змінної SQLSTATE буде присвоєно значення 02000 Якщо ж таких рядків виявиться більше однієї, буде зафіксована помилка і змінна SQLSTATE міститиме її код

■&nbsp Оператор INSERT Вставити в таблицю Р відомості про нову деталі (номер деталі, її назва і вага задаються вмістом базових змінних Р #, PNAME, PWT, відповідно колір деталі і місто невідомі)

EXEC SQL INSERT

INTO P ( P#, PNAME, WEIGHT ) VALUES ( :P#, :PNAME, :PWT )

;

Стовпцях COLOR і CITY знову додається рядка таблиці будуть присвоєні відповідні значення, застосовувані за замовчуванням Детальніше про це йтиметься в розділі 66 глави 6 Слід зазначити, що з причин, аналіз яких виходить за рамки даної книги, що застосовується за умовчанням значення для стовпця, який має деякий тип, визначений користувачем, обовязково має бути невизначеним (NULL) (Детальний обговорення теми, що стосується невизначених значень, відкладається до глави 19 однак нам неминуче доведеться час від часу повертатися до цього питання)

Оператор DELETE Видалити відомості про всі поставки для постачальників з міста, назва якого поміщено в базову змінну CITY

EXEC SQL DELETE FROM  SP

WHERE :CITY =

( SELECT CITY FROM   S

WHERE SS# = SPS#

)

І знову, якщо немає рядків, які відповідають умові WHERE, змінної SQLSTATE присвоюється значення 02000 Також зверніть увагу на вкладений подзапрос (цього разу в реченні WHERE)

■&nbsp&nbsp&nbsp&nbsp Оператор UPDATE Збільшити статус всіх постачальників з Лондона на значення,

поміщене в базову змінну RAISE

EXEC SQL UPDATE S

SET   STATUS = STATUS +

:RAISE WHERE CITY = London1

;

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

WHERE, система присвоїть змінній SQLSTATE значення 02000

Операції, в яких використовуються курсори

Тепер перейдемо до питання про вибірках на рівні множин, тобто про вибірках не однієї рядки, як це було у випадку однострочного оператора SELECT, а безлічі з довільною кількістю рядків Як вказувалося раніше, в цій ситуації потрібно почерговий доступ до рядків обраного безлічі, а механізмом такого доступу буде курсор На рис 44 цей процес схематично проілюстровано на прикладі вибірки інформації про постачальників (стовпці s #, SNAME і STATUS) для всіх постачальників з міста, назва якого задається в базовій змінної У

EXEC SQL DECLARE X CURSOR FOR / * Визначити курсор * / SELECT SS #, SSNAME, SSTATUS FROM S

WHERE  SCITY = :Y ORDER  BY Si ASC

EXEC SQL OPEN X / * Виконати запит * / DO <для всіх рядків S, доступних через Х>

EXEC SQL FETCH X INTO :S#, :SNAME, :STATUS

/ * Отримати дані про

наступному постачальнику * /

END

EXEC SQL CLOSE X / * Перевести курсор X в

неактивний стан * /

Рис 44 Вибірка кількох рядків

Пояснення Оператор DECLARE X CURSOR визначає курсор х, повязаний з табличним виразом(Тобто виразом, який повертає таблицю) Табличне вираз визначається оператором SELECT, який є частиною всього виразу

DECLARE, але не обчислюється в цьому місці програми, оскільки оператор DECLARE CURSOR-чисто декларативний Табличне вираз обчислюється тільки при відкритті курсору (оператор OPEN X) Далі для вибірки рядків з результуючого безлічі, по одній за один раз, використовується оператор FETCH X INTO , Що привласнює витягнуті значення базовим змінним у відповідності зі специфікаціями в конструкції INTO (Для простоти базовим змінним присвоєно імена, що збігаються з іменами відповідних стовпців таблиці бази даних Зверніть увагу, що в операторі SELECT при визначенні курсору не запитує власна конструкція INTO) Оскільки в результуючому наборі потенційно присутня велика кількість рядків, оператор FETCH зазвичай викликається в циклі Цикл буде повторюватися до тих пір, поки не закінчаться рядки в результуючому наборі Після виходу з циклу курсор х закривається (оператор CLOSE X)

А тепер розглянемо курсори і операції з ними більш докладно Курсор визначається за допомогою оператора DECLARE CURSOR, який має наступний загальний вигляд

EXEC SQL DECLARE &ltcursor name&gt CURSOR FOR &lttable exp&gt [ &ltordering&gt ]

Для стислості кілька необовязкових специфікацій в цьому визначенні не вказані Тут параметр &ltcursor name&gt – Це імя визначається курсора Необовязковий параметр визначення сортування результату вибірки &ltordering&gt має наступний формат

ORDER BY  &ltorder item  commalist&gt

Тут параметр &ltorder item commalist&gt — розділений комами список елементів &ltorder i tem&gt, за якими має бути виконано впорядкування видобутих рядків Список повинен містити не менше одного елемента < order i tem&gt, а в кожному елементі списку повинно міститися імя стовпця (зауважте, неуточнене) 4, після якого може слідувати необовязкове службове слово ASC (по зростанню) або DESC (за спаданням) За відсутності службового слова за замовчуванням приймається порядок за зростанням (ASC) Якщо конструкція ORDER BY не визначена, то принцип упорядкування визначається системою (Фактично, останнє зауваження залишається в силі, якщо навіть визначена конструкція ORDER BY, принаймні, коли мова йде про рядках з одним і тим же значенням для зазначеного списку < order item commalist&gt.)

Примітка Дамо визначення зручному терміну розділений комами список елементів (commalist) Нехай &ltxyz&gt позначає довільну синтаксичну категорію (тобто те, що знаходиться зліва від деякого правила виведення в нотації BNF) Тоді вираз &ltxyz commalist&gt (Або <Розділений комами список xyz>) позначає послідовність від нуля і більше елементів &ltxyz&gt, в якій кожна пара елементів &ltxyz&gt розділена

4 Фактично, імя стовпця може бути уточнено, якщо задане табличне вираз

відповідає досить складному набору правил Ці правила були вперше введені в стандарті SQL: 1999, в якому також регламентовані правила, згідно з якими елемент може іноді визначати або обчислювальний вираз, наприклад, ORDER BY A + B, або імя стовпця, який входить до склад таблиці результату, наприклад, SELECT CITY FROM S ORDER BY STATUS Виклад докладних відомостей про ці правила виходить за рамки цієї книги

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

Як стверджувалося раніше, оператор DECLARE CURSOR – декларативний, а не виконується Він призначений для оголошення курсору з певним імям, для якого передбачено табличне вираз і з яким постійно повязаний тип упорядкування Табличне вираз може включати посилання на базові змінні Програма може містити будь-яку кількість операторів DECLARE CURSOR, кожен з яких повинен бути, звичайно, призначений для визначення різних курсорів

Для роботи з курсорами існує три виконуваних оператора: OPEN, FETCH І

CLOSE

■ Оператор OPEN має наступний формат

EXEC SQL OPEN &ltcursor name>

Він призначений для відкриття або активізації зазначеного курсору (який в даний момент не повинен бути відкритий) У результаті його виконання обчислюється повязане з цим курсором табличне вираз (причому для всіх базових змінних, що згадуються в цьому виразі, використовуються поточні значення) В результаті ідентифікується певну безліч рядків, яке стає поточним активним набором для даного курсора Курсор також встановлює вихідну позицію в цьому активному наборі, а саме – позицію перед його першим рядком Слід зазначити, що активні набори завжди розглядаються як впорядковані (див наведене вище опис конструкції ORDER BY), а значить, і поняття позиції має для них смисл5

■ Оператор FETCH має наступний формат

EXEC SQL FETCH &ltcursor name&gt

INTO &lthost variable reference commalist&gt

Тут параметр&lthost  variable  reference  commalist&gt-Розділений комами список посилань на базові змінні Цей оператор служить для переміщення позиції зазначеного курсору (який повинен бути вже відкритий) до наступного рядка в його активному наборі з подальшим привласненням значень стовпців цього рядка базовим змінним, зазначеним у реченні INTO Якщо після чергового виклику оператора FETCH на виконання наступна рядок відсутній, то вибірка даних не виробляється і змінної SQLSTATE присвоюється значення 02 000

■ Оператор CLOSE має наступний формат

EXEC  SQL CLOSE  &ltcursor name&gt   

5 Самі по собі безлічі, звичайно, не є впорядкованими (глава 6), так що активний набір – Це насправді не безліч як таке Його краще представляти у вигляді впорядкованого списку або масиву (Рядків)

Він служить для закриття (Деактивизации) зазначеного курсору (який повинен бути в даний момент відкритим) Після його виконання з курсором вже не буде повязаний активний набір Проте надалі курсор знову може бути відкритий при цьому він знову отримає активний набір – можливо, вже не такий, як раніше (зокрема, якщо значення вказаних в оголошенні курсору базових змінних до поточного моменту були змінені) Слід зазначити, що зміна цих змінних при відкритому курсорі не робить впливу на його активний набір

Є ще два оператора, в яких можуть використовуватися посилання на курсори, – це варіанти операторів UPDATE і DELETE З конструкцією CURRENT ЯКЩО курсор (скажімо, х) в даний момент позиціонується на певну рядок, то можна оновити або видалити цю поточний рядок курсору х, тобто рядок, на яку в даний момент позиціонується курсор х, наприклад, як показано нижче

EXEC SQL UPDATE S

SET STATUS = STATUS +

:RAISE WHERE CURRENT OF X

;

Вирази CURRENT операторів DELETE і UPDATE будуть неприпустимими, якщо табличне вираз < table exp&gt в оголошенні курсору визначено за участю неоновлювані уявлення, створеного за допомогою оператора CREATE VIEW (подробиці приведені в главі 10, розділ 106)

Динамічний мова SQL і інтерфейс SQL / CLI

У попередньому розділі за замовчуванням передбачалося, що дана конкретна програма (включаючи оператори SQL і всі оператори базової мови) може бути повністю відкомпільована завчасно (Тобто до настання етапу прогону) у тому вигляді, в якому вона реалізується на даний момент Проте стосовно деяким додаткам дотримання такої умови не можна гарантувати Наприклад, розглянемо оперативне додаток (Нагадаємо, що, як зазначалося в розділі 1, оперативними називаються додатки, які надають користувачеві доступ до бази даних з деякого інтерактивного терміналу або подібного йому пристрою) Як правило, в цьому додатку повинні виконуватися приблизно такі дії, як показано нижче

1 Прийняти з терміналу команду користувача

2 Проаналізувати надійшла команду

3 Згенерувати відповідні оператори SQL для звернення до бази даних

4 Повернути повідомлення та (або) отримані результати на термінал

Якщо набір команд користувача, який програма може прийняти з терміналу в кроці 1, досить малий (як, наприклад, у випадку обробки попередніх замовлень місць на авіалініях), то набір всіх можливих виконуваних операторів SQL також буде невеликий і його можна буде безпосередньо впровадити в програму У цьому випадку дії на другому і третьому етапах будуть складатися в логічній перевірці введеної команди з наступним переходом до тієї частини програми, яка виконує заздалегідь визначені оператори SQL З іншого боку, якщо набір вводяться команд досить різноманітний, було б непрактично заздалегідь зумовлювати і впроваджувати в програму всі

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

Динамічний мова SQL

Засоби динамічного мови SQL – Це частина засобів підтримки впровадження мови SQL Вони складаються з безлічі динамічних операторів (Компіляція самих цих операторів здійснюється завчасно), призначення яких полягає саме в тому, щоб забезпечувати підтримку трансляції та виконання звичайних операторів SQL, створюваних на етапі прогону програми Таким чином, існують два основних динамічних оператора SQL – PREPARE (Підготувати – по суті, компілювати) і EXECUTE (Виконати) Їх використання проілюстровано на наступному (нереальному по своїй простоті, але досить точному) прикладі мовою PL / I

DCL SQLSOURCE CHAR VARYING (65000)

SQLSOURCE = DELETE FROM SP WHERE QTY &lt QTY ( 3 00

) EXEC SQL PREPARE SQLPREPPED FROM :SQLSOURCE EXEC SQL EXECUTE SQLPREPPED

Пояснення

1 Імя SQLSOURCE ідентифікує змінну мови PL / I типу символьної будів ки змінної довжини, в якій на етапі прогону програма певним про разом готує вихідну форму (тобто уявлення у вигляді символьного рядка) деякого оператора SQL, в нашому конкретному прикладі – оператора DELETE

2 Імя SQLPREPPED, навпаки, ідентифікує змінну середовища SQL, а не базової мови PL / I, яка буде (в принципі) використовуватися для зберігання компілює ванній форми оператора SQL (вихідна форма якого представлена ​​в змін ної SQLSOURCE) Звичайно, імена, подібні SQLSOURCE І SQLPREPPED, МОЖНА вибирати довільно

3 За допомогою оператора привласнення SQLSOURCE = ..; мовою PL / I змін ної SQLSOURCE присвоюється вихідна форма оператора SQL DELETE Звичайно, на практиці процес формування такого вихідного оператора буде значитель але складніше і, можливо, в ньому будуть використовуватися введення і аналіз деяких елементів запитів від кінцевого користувача, виражених на природній мові або в іншій, більш дружньої формі, ніж звичайний мову SQL

4 Оператор PREPARE витягує це вихідне вираз і готує (тобто ком пілірует) його, створюючи виконувану версію витягнутого їм оператора, збе няемие у змінній SQLPREPPED

5 Оператор EXECUTE виконує Відкомпілювати версію оператора з змінної SQLPREPPED, в результаті чого здійснюється власне операція DELETE Інформація SQLSTATE виконаного оператора DELETE повертається так само, як при виконанні аналогічного оператора видалення, звичайним сбразом

Зверніть увагу, що імя SQLPREPPED ідентифікує змінну мови SQL, a НЕ PL/I, тому при його використанні в операторах PREPARE І EXECUTE двокрапка перед ним не вказується Важливо також, що подібні змінні SQL явно не оголошуються

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

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

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

замість формальних параметрів перед виконанням динамічно сформованих операторів крім того, є аналоги тих коштів курсорів, які описані в попередньому розділі Зокрема, до складу цих коштів входить оператор EXECUTE IMMEDIATE, який фактично дозволяє обєднати функції PREPARE І EXECUTE В ОДНІЙ операції

Інтерфейси рівня викликів SQL / CLI

Засоби інтерфейсу рівня викликів SQL (SQL Call-Level Interface – SQL / CLI, або скорочено CLI) були введені в стандарт SQL в 1995 році Інтерфейс CLI в основному створено на базі інтерфейсу ODBC (Open Database Connectivity) компанії Microsoft І той, і інший інтерфейс дозволяє додаткам, які написані на одному з базових мов, видавати запити до бази даних, звертаючись до процедурам СLI, наданим виробником, не вдаючись до допомоги впроваджених операторів SQL Потім у цих процедурах, які попередньо повинні бути обовязково повязані з даним додатком, використовується динамічний мова SQL для виконання необхідних операцій з базою даних від імені програми (Іншими словами, з точки зору СУБД процедури CLI нічим не відрізняються від звичайного застосування)

Як бачимо, інтерфейс SQL / CLI (а також ODBC) вирішує ту ж задачу, що і динамічний мова SQL, а саме – дозволяє додатку передавати на виконання текст оператора SQL саме до того часу, коли його безпосередньо необхідно виконувати Однак застосовуваний в інтерфейсах CLI і ODBC підхід до вирішення цього завдання організований краще, ніж у динамічному мовою SQL Його переваги полягають у наступному

■ По-перше, динамічний мова SQL – це вихідний код, який повинен відповідати стандарту SQL Тому для будь-якого додатку, який використовує динамічний мова SQL, потрібно якийсь компілятор SQL, необхідний для обробки встановлених стандартом операцій, таких як PREPARE, EXECUTE і тд Інтерфейсом CLI, навпаки, нормовані лише подробиці виклику процедур (Тобто в основному виклику підпрограм) Не потрібні кошти спеціального

компілятора досить використовувати звичайний компілятор стандартного базового мови Тому додаток може поширюватися (можливо навіть сторонніми виробниками програмного забезпечення) в стислій формі, у вигляді обєктного коду

■ По-друге, такі програми можуть бути незалежними від типу СУБД,тобто інтерфейс SQL / CLI включає засоби створення універсальних програм (знову ж, можливо, сторонніми виробниками програмного забезпечення), які можуть використовуватися для декількох різних типів СУБД, без спеціалізації з урахуванням якоїсь конкретної СУБД

Нижче як ілюстрації використання інтерфейсу SQL / CLI наведено аналог прикладу динамічного виклику SQL, який можна знайти в попередньому підрозділі

char sqlsource [65000]

strcpy ( sqlsource,

&quotDELETE FROM SP WHERE QTY &lt QTY ( 300 )&quot ) rc = SQLExecDirect ( hstmt, (SQLCHAR *)sqlsource, SQL_NTS )

Пояснення

1 Оскільки в реальних додатках SQL / CLI базовою мовою зазвичай служить С, в даному прикладі замість PL / I використовується С Крім того, у відповідності зі спе цифікації SQL / CLI в іменах змінних, іменах процедур тощо використовуються прописні літери (або поєднання великих і малих літер), а не тільки про Пісний букви, як у всіх інших іменах в цій книзі (крім того, в цих по пояснювальною примітках імена виділені для наочності моноширінним шрифтом) Необхідно також враховувати, що інтерфейс SQL / CLI являє собою набір стандартних засобів для виклику підпрограм з базової мови, з цього його синтаксис (а також, безумовно, відповідна семантика) змінює

ся залежно від базової мови

2 Функція strcpy мови С викликається для копіювання вихідної форми визна ленного оператора DELETE мови SQL в змінну sqlsource мови С

3 Оператор присвоювання С (=) викликає процедуру SQLExecDirect інтерфейсу SQL / CLI (аналог оператора EXECUTE IMMEDIATE динамічного мови SQL) для виконання оператора SQL, що міститься в змінній sqlsource, і при привласнювати змінної гс програми З код повернення, отриманий в результаті цього виклику

Як і можна було б припустити, інтерфейс SQL / CLI в тій чи іншій мірі включає аналоги всіх засобів динамічного виконання SQL, поряд з деякими доповненнями Більш докладний опис цього інтерфейсу виходить за рамки даної книги Проте слід враховувати, що такі інтерфейси, як CLI, ODBC і JDBC (фактично варіант ODBC для мови Java), набувають все більш важливе практичне значення з причин, які будуть обговорюватися в главе21, розділ 216

Джерело: Дейт К Дж, Введення в системи баз даних, 8-е видання: Пер з англ – М: Видавничий дім «Вільямс», 2005 – 1328 с: Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*