При объединении
операторов SQL с базовым языком программирования должны соблюдаться следующие
принципы:
Операторы
манипулирования данными не требуют изменения для их встраивания в программный
SQL. Однако оператор поиска (SELECT) потребовал изменений.
Стандартный
оператор SELECT возвращает набор данных, релевантный сформированным условиям
запроса. В интерактивном SQL этот полученный набор данных просто выводится на
консоль пользователя и он может просмотреть полученные результаты. Встроенный
оператор SELECT должен создавать структуры данных,
которые согласуются с базовыми языками программирования. Во встроенном SQL запросы
делятся на 2 типа:
Первый тип
запроса — однострочный запрос во встроенном SQL вызвал модификацию оператора
SQL, которая выглядит следующим образом:
SELECT [{ALL | DISTINCT}] <список возвращаемых столбцов>
INTO <список переменных базового языка>
FROM <список исходных таблиц>
[WHERE <условия
соединения и поиска>]
Мы видим,
что во встроенный SELECT добавился новый для нас раздел, содержащий список переменных
базового языка. Именно в эти переменные будет помещен результат однострочного
запроса, поэтому список переменных базового языка должен быть согласован как
по порядку, так и по типу и размеру данных со списком возвращаемых столбцов.
По правилам любого языка программирования все базовые переменные предварительно
описаны в прикладной программе. Например, если в нашей БД «Библиотека»
существует таблица READERS (Читатели), мы можем получить сведения о конкретном
читателе.
CREATE TABLE READERS
(
READER_ID Small int(4) PRIMARY KEY,
FIRSTJAME char (30) NOT NULL,
LAST_NAME char(30) NOT NULL,
ADRES char(50) , HOME_PHON char(12) ,
WORK_PHON char
(12) .
BIRTH_DAY date СНЕCK( DateDiff (year, GetDate(),BIRTH_DAY) >=17 )
);
Для этого
опишем базовые переменные. Рассмотрим пример для MS SQL SERVER 7.0, используя
язык Transact SQL. При описании локальных переменных в языке Transact SQL используется
специальный символ @. Комментарии в Transact SQL заключены в парные символы
/* комментарий */.
DECLARE @READER_ID
int
DECLARE @FIRS_NAME
Char(30). @LAST_NAME Char(30). @ADRES Char(50)
DECLARE @HOME_PHON Char(12) .@WORK_PHON Char(12)
/* зададим уникальный
номер читательского билета */
SET @READER_ID
= 4
/* теперь выполним
запрос и поместим полученные сведения в определенные
ранее переменные */
SELECT READERS.FIRST_NAME.
READERS.LAST_NAME. READERS.ADRES.
READERS.HOME_PHON.
READERS.WORK_PHON
INTO @FIRS_NAME, @LAST_NAME.
@PADRES. @HOME_PHON.@WORK_PHON
FROM READERS
WHERE READERS.READER_ID
= @READER_ID
В этом простом
примере мы имена переменных сделали такими же, как и имена столбцов таблицы
READERS, но это необязательно. Однако транслятор различает эти объекты, именно
поэтому в диалекте Transact SQL принято локальные переменные предварять специальным
символом @. В примере мы использовали квалифицированные имена полей, имена полей,
предваряемые именем таблицы. В нашем случае это тоже необязательно, потому что
запрос выбирает данные только из одной таблицы.
В нашем примере
базовые переменные играют разную роль. Локальная переменная PREADER_ID является
входной по отношению к запросу. Ей присвоено значение 4, и в запросе это значение
используется для фильтрации данных, поэтому эта переменная используется в условии
WHERE.
Остальные
базовые переменные играют роль выходных переменных, в них СУБД помещает результат
выполнения запроса, помещая в них значения соответствующих полей отношения READERS,
извлеченные из БД.