Теория баз данных

       

Особенности встроенного SQL


При объединении операторов SQL с базовым языком программирования должны соблюдаться следующие принципы:

  • Операторы SQL включаются непосредственно в текст программы на исходном языке программирования. Исходная программа поступает на вход препроцессора SQL, который компилирует операторы SQL.

  • Встроенные операторы SQL могут ссылаться на переменные базового языка программирования.

  • Встроенные операторы SQL получают результаты SQL-запросов с помощью переменных базового языка программирования.

  • Для присвоения неопределенных значений (NULL) атрибутам отношений БД используются специальные функции.

  • Для обеспечения построчной обработки результатов запросов во встроенный SQL добавляются несколько новых операторов, которые отсутствуют в интерактивном 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, извлеченные из БД.


    Содержание раздела