Программирование >>  Sql: полное руководство 

1 ... 157 158 159 [ 160 ] 161 162 163 ... 264


I- EXECUTE IMMEDIATE базовая пврвмвнная

I- PREPARE имя инструкции FROM базовая лвременная I- EXECUTE имя инструкции

USING -

базовая пврвмвнная

USING SQL DESCRIPTOR имя двскриптора

INTO

базовая первмвнная

INTO SQL DESCRIPTOR имя двскриптора

DEALLOCATE PREPARE имя инструщии

Рис. Т8.18. Динамические инсгрущии SQL стандарта SQi2

В стандарте SQL2 имеется инструкция execute immediate, предназначенная для немедленного выполнения инструкции SQL, переданной в буфер в символьном виде. Синтаксис инструкции execute immediate точно повторяет синтаксис аналогичной инструкции в DB2. Например, инструкция execute immediate, представленная на рис. 18.2, соответствует стандарту SQL2.

Имеющиеся в стандарте SQL2 инструкции prepare и execute также функционируют аналогично своим двойникам в DB2. Первая из них передает в СУБД текст инструкции SQL и дает ей команду проанализировать инструкцию, оптимизировать ее и создать для нее план выполнения. Вторая вызывает выполнение предварительно подготовленной инструкции. Эта инструкция execute, как и ее версия в DB2, может содержать базовые переменные, используемые для передачи значений параметров, необходимых при выполнении динамической инструкции SQL. Таким образом, инструкции prepare и execute, представленные на рис. 18.4 (они обозначены цифрами 2 и 3), соответствуют стандарту SQL2.

В разделе, касающемся полной совместимости со стандартом SQL2 (уровень Full Level), определены два полезных расширения инструкций prepare и execute. Первое из них - это инструкция deallocate prepare, ДОПОЛНЯЮЩаЯ ИНСТРУКЦИЮ prepare. Она отменяет подготовку ранее скомпилированной динамической инструкции SQL. Когда СУБД выполняет эту инструкцию, она может освобождать ресурсы, занятые скомпилированной инструкцией; сюда, как правило, входит план выполнения для данной инструкции Имя, указанное в инструкции deallocate prepare, должно быть тем же, что и в ранее выполненной инструкции prepare.

Учтите: если та или иная СУБД не реализует возможности, предоставляемые Инструкцией deallocate prepare, ТО она никак НС может узнать, будет еще выполняться подготовленная ранее инструкция или нет, и поэтому должна хранить всю информацию, связанную с данной инструкцией. На практике некоторые СУБД <ранят скомпилированную версию инструкции только до конца транзакции; в последующих транзакциях инструкция должна быть подготовлена повторно. Поскольку это не очень эффективный подход, в ряде СУБД информация о скомпилированной инструкции хранится бесконечно долго. В таких случаях инструкция Deallocate prepare может играть важную роль, особенно когда сеанс подключения



к базе данных длится часами. Следует, однако, отметить, что в стандарте SQL2 четко указано: доступность подготовленной инструкции за пределами транзакции зависит от реализации .

Второе расширение касается инструкции EXECUTE, которая теперь может применяться для выполнения одиночной инструкции SELECT, возвращающей одну строку результатов запроса. Как и в DB2, в SQL2 инструкция EXECUTE включает предложение using с именами базовых переменных, содержащих значения параметров запроса Но появилось также дополнительное предложение into, содержащее имена базовых переменных, которые принимают результаты запроса, возвращающего отдельную запись. Предположим, вы написали программу, которая динамически формирует инструкцию, возвращающую имя и план продаж служащего, чей идентификатор передан в качестве входного параметра. В DB2 даже столь простой запрос потребовал бы использовать область sqlda, указатели наборов записей, цикл с инструкцией FETCH и т.п. в SQL2 достаточно выполнить всего две инструкции:

PREPARE qrystmt FROM :statement buffer;

EXECUTE qrystmt USING :emplnum INTO :name, :quota;

Как и в случае с любой другой подготовленной инструкцией, запрос qrystmt может выполняться многократно. Конечно, он еще не избавлен от прежнего недостатка: число возвращаемьсх столбцов и их типы данных должны быть известны заранее, поскольку они должны в точности соответствовать количеству и типам базовых переменных, указанных в предложении INTO. Но этот недостаток можно устранить с помощью области дескриптора (эквивалент области sqlda), заменяющей список базовых переменных, как описано в следующем параграфе.

Стандарт SQL2 и область SQLDA

Хотя обработка инструкций PREPARE/EXECUTE осуществляется схожим образом как в DB2, так и в SQL2, обработка динамических запросов на выборку вьшолняется в SQL2 совсем по-другому. Основные различия связаны с областью SQLDA. Вспомним, что эта область обеспечивает вьшолнение двух важных функций:

предоставление гибкого способа передачи параметров, которые будут использоваться при выполнении динамической инструкции SQL (что обеспечивает перг-дачу данных из базовой программы в СУБД);

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

В DB2 область sqlda позволяет выполнять эти функции довольно гибко, однако она обладает рядом серьезных недостатков. Это сфуктура данных очень низкого уровня, весьма специфическая для каждого языка профаммирования. Тот факт, например, что область sqlda в DB2 имеет переменный размер, зафудняет ее представление в языке FORTRAN. Кроме того, при ее формировании были сделаны неявные предположения, касающиеся памяти компьютерной системы, на которой выполняется профамма, использующая динамический SQL. Для создателей стандарта SQL2 эти элементы низкого уровня были неприемлемой помехой на пути обеспечения переносимости баз данных. Поэтому они заменили сфуктуру SQLDA набором инструкций, предназначенных для работы с более абсфактной сфуктурой данных, называемой дескриптором.



Структура дескриптора, соответствующая стандарту SQL2, описана в табл. 18.2. Дескриптор играет точно такую же роль, что и область sqlda, изображенная на рис 18.7. В фиксированной части дескриптора находится счетчик числа элементов, расположенных в переменной части дескриптора. Каждый элемент переменной части содержит информацию об одном передаваемом параметре, такую как тип данных, ддина, индикатор (указывающий, передается ли значение null) и тому подобное. Но, в отличие от области sqlda, дескриптор не является структурой данных, определяемой в базовой программе. Он представляет собой совокупность элементов данных, принадлежащих программному обеспечению СУБД. Программа выполняет операции над дескрипторами (создает, удаляет, заносит и извлекает данные) посредством нового набора динамических инструкций SQL, специально предназначенных для этой цели (рис. 18.19).

I- ALLOCATE DESCRIPTOR имя дескриптора

- WITH MAX число элементов

I- DEALLOCATE DESCRIPTOR имя дескриптора - SET DESCRIPTOR-

-COUNT = базовая переменная-

- VALUE номер элемента - имя элемента=базовая пврвмвнная-

- GET DESCRIPTOR -

-базовая пврвмвнная = COUNT-

-VALUEномер элемента-J- базовая переменная=имя эпвмвнта-А

Рис. 18.19. Инстру/щии управления дескрипторами в стандарте SQL2

Таблица 182. Структура дескриптора в стандарте SQL2

Фиксированная часть

COUNT

Переменная часть - одна на запроса)

TYPE LENGTH

OCTET LENGTH

RETURNED LENGTH

RETURNED OCTET LENGTH

PRECISION SCALE

Описание

число описываемых элементов каждый элемент (пара.четр или столбец таблицы результатов

тип данных элемента длина элемента

длина элемента (в виде количества восьмибитовых наборов)

длина возвращаемого элемента данных

длина возвращаемых данных (в виде количества восьмибитовых наборов)

точность представления десятичного элемента данных степень масштабирования десятичного элемента данных



1 ... 157 158 159 [ 160 ] 161 162 163 ... 264

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика