У попередніх лабораторних роботах, розглядаючи пропозиції SQL, не обумовлювалося, звідки попадають у СУБД запити. Передбачалося, що SQL використовується в інтерактивному режимі і запити вводяться з клавіатури. Однак усі пропозиції SQL можна використовувати також у додатках. Сучасні СУБД мають власні мови програмування, що містять в собі SQL. Інші працюють із програмами, написаними на одній з розповсюджених алгоритмічних мов (С++, Pascal, …), у які включаються пропозиції SQL. Для обміну інформацією з частинами програми, написаними на будь-якій з цих мов, існують спеціальні конструкції SQL, які дозволяють працювати зі змінними і окремими рядками таблиць.
Змінні мови програмування:
· можуть з'являтися у пропозиціях маніпулювання даними SQL тільки у фразах SELECT і ІNTO пропозиції SELECT, фразі WHERE пропозицій SELECT, UPDATE і DELETE, фразі SET пропозиції UPDATE, фразі VALUES пропозиції ІNSERT і, нарешті, як елемент виразу у фразах SELECT, WHERE чи SET, але не VALUES;
· повинні мати типи даних, сумісні з типами даних тих стовпців БД, з якими вони повинні порівнюватися, значення яких їм повинні бути присвоєно чи яким повинні бути присвоєні значення змінних;
· можуть мати імена, які збігаються з іменами стовпців БД (система розрізняє їх за місцем розташування у пропозиціях SQL чи за спеціальним символом, наприклад, ".", який встановлюється перед ім'ям змінної, якщо потрібно використовувати її значення).
Після виконання будь-якої пропозиції SQL відбувається відновлення системної змінної SQLCODE (в неї заноситься числовий індикатор стану). Нульове значення SQLCODE означає, що пропозиція виконана успішно. Позитивне значення означає, що пропозиція виконана, але мала місце деяка виняткова ситуація. Наприклад, значення +100 вказує, що не було знайдено ніяких даних, що задовольняють запиту. Нарешті, негативне значення вказує, що мала місце помилка і пропозиція не виконана. Тому за кожною пропозицією SQL у програмі повинна слідувати перевірка значення SQLCODE і починатися відповідна дія, якщо це значення виявилося не таким, яке очікувалося.
Нерідко програма вимагає у кожний момент часу значення тільки з одного рядка таблиці; для цього використовується одиничний оператор SELECT:
В одиничному SELECT можна задати за кожною змінною слово ІNDІCATOR і ім'я індикаторної змінної. Значення індикаторних змінних не дорівнюють нулю тільки при нульовому значенні SQLCODE і NULL-значеннях елементів SELECT для відповідних цільових змінних.
Основна проблема "вбудовування" пропозиції SELECT у програму полягає в тому, що SELECT, як правило, породжує таблицю з множиною рядків і стовпців, а мова програмування не має достатніх засобів одночасного оперування більш ніж одним записом (рядком). З цих причин необхідно забезпечити свого роду «місток» між рівнем множин SQL і рівнем записів мови програмування. Таку можливість забезпечують курсори. Курсор являє собою покажчик, що може використовуватися для перегляду множини записів. По черзі вказуючи кожен запис у множині, він забезпечує можливість звертання до цих записів по одній одночасно.
Декларація:
DECLARE <ім'я_курсору> CURSOR FOR <підзапит>
визначає ім'я курсору і зв'язаний з ним підзапит. З його допомогою ідентифікується деяка множина стовпців і рядків вказаної таблиці (сукупності таблиць), що стає активною множиною для даного курсору. Курсор ідентифікує позицію у цій множині (спочатку це позиція першого запису). Активні множини розглядаються як впорядковані (або за фразою ORDER BY, або в порядку завантаження рядків у таблицю).
Описані за допомогою DECLARE CURSOR множини використовуються у пропозиціях SQL: DELETE, UPDATE чи присвоєння значень перерахованих у SELECT стовпців змінним, список яких вказується у пропозиції FETCH (викликати). Однак перед виконанням цих команд необхідно активізувати курсор, який в цей момент не повинен бути відкритим. Для цього використовується пропозиція OPEN (OPEN <ім'я_курсору>).
використовується для вибірки того запису активної множини, на яку вказує курсор, для присвоєння значень стовпців цього запису змінним, перерахованим у фразі ІNTO, і для переміщення курсору на наступний рядок активної множини. При переміщенні за останній рядок змінна SQLCODE прийме значення +100.
Команду FETCH зазвичай розташовують у деякому циклі, розміщуючи за нею команду аналізу SQLCODE. Це дозволяє знайти перехід від значення 0 на +100 і організувати вихід з циклу. Слід визначити ще дві пропозиції, які зв'язані з курсорами.