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

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


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

Следующая инструкция describe в Oracle запрашивает описание столбцов таблицы результатов предварительно подготовленной динамической инструкции:

exec sql describe select list for qrystmt into qry sqlda;

Она соответствует такой инструкции DB2:

exec sql describe qrystmt into qry sqlda;

Приведенная ниже инструкция describe в Oracle запрашивает описание именованных параметров предварительно подготовленной динамической инструкции. Подготовленная инструкция может быть как запросом на выборку, так и какой-нибудь иной инструкцией SQL:

exec sql describe bind variables for thestmt into the sqlda;

Данная инструкция не имеет эквивалента в DB2. После нее программа, как правило, просматривает информацию в области sqlda, записывает в нее указатели на значения параметров, которые она хочет передать в СУБД, и выполняет динамическую инструкцию, применяя инструкции execute или open, использующие область sqlda:

exec sql execute thestmt using descriptor the sqlda;

exec sql open qrycursor using descriptor the sqlda;

Информация, возвращаемая в Oracle инструкциями describe обеих форм, является идентичной и рассматривается в следующем параграфе.

Область SQLDA в Oracle

Область sqlda в Oracle выполняет те же функции, что и в DB2, но ее формат, представленный на рис. 18.17, существенно отличается. Два основных поля в заголовке области sqlda из DB2 имеют аналоги в области sqlda из Oracle:

Поле N в Oracle задает-размер массива, в котором размещаются описания столбцов. Оно соответствует полю SQLN в DB2.

Поле f в Oracle указывает, сколько столбцов описано в настоящий момент в массивах области sqlda. Оно соответствует полю sqld в DB2.

struct sqlda

char

**V;

*L

short

short

**I;

char

**S;

short

snort

char

**X;

short

short

количество элементов в массивах SQLDA */ указатель на массив указателей на области данных */ указатель на массив размеров буферов */ указатель на массив кодов типов данных */

указатель на массив указателей на переменные-индикаторы */ количество активных эле.ментов в массивах SQLDA */ указатель на массив указателей на имена столбцов/параметров */ указатель на массив размеров буферов имен */ указатель на массив текущих длин имен */ указатель на массив указателей на имена параметров-индикаторов */

указатель на массив размеров буферов имен параметров-индикаторов */

указатель на массив текущих длин имен параметров-индикаторов */

Риа 18.17. Область SQLDA в СУШ Orach



Вместо одного массива структур SQLVAR с описаниями столбцов область sqlda в Oracle содержит указатели на несколько массивов, описывающих различные параметры столбцов таблицы результатов запроса:

И Поле т указывает на массив целых чисел, представляющих собой коды типов данных столбцов или именованных параметров. Значения в этом массиве соответствуют полям sqltype структур sqlvar в DB2.

И Поле v адресует массив указателей на буферы для столбцов или передаваемых значений параметров. Указатели этого массива соответствуют полям sqldata структур sqlvar в DB2.

и Поле l указывает на массив целых чисел, соответствующих размерам буферов, заданных в поле v. Значения в этом массиве соответствуют полям sqllen

структур sqlvar в DB2.

и Поле i адресует массив указателей на переменные-индикаторы для столбцов или именованных параметров. Указатели этого массива соответствуют полям SQLIND

структур sqlvar в DB2.

Поле s адресует массив строковых указателей на буферы, куда Oracle возвращает имена столбцов или именованных параметров. Эти буферы соответствуют структурам sqlname, которые являются членами структур sqlvar в DB2.

Поле м адресует массив целых чисел, соответствующих размерам буферов, указанных в поле s. Буферы для структур sqlname в DB2 имеют фиксированный размер, поэтому в DB2 отсутствует эквивалент поля м.

Поле с указывает на массив целых чисел, которые представляют собой действительные длины имен, возвращаемых в буферы, заданные в поле s. Когда СУБД Oracle возвращает имена столбцов или параметров, она записывает в этот массив целые числа, указывающие действительные длины имен. Буферы для структур sqlname в DB2 имеют фиксированный размер, поэтому в DB2 отсутствует эквивалент поля с.

Поле X адресует массив строковых указателей на буферы, куда Oracle возвращает имена параметров-индикаторов. Эти буферы используются только в Oracle инструкцией describe bind variables; Эквивалент для них в DB2 отсутствует.

Поле y указывает на массив целых чисел, представляющих собой размеры буферов, заданных в поле X. Эквивалент в DB2 отсутствует.

Поле Z указывает на массив целых чисел, которые представляют собой действительные длины имен параметров-индикаторов, возвращаемых в буферы, заданные в поле X. Когда СУБД Oracle возвращает имена параметров-индикаторов, она записывает в этот массив целые числа, указывающие действительные длины имен. Эквивалент в DB2 отсутствует.

Преобразования типов данных

В DB2 применяются те же форматы типов данных (в частности, для приема значений параметров и возвращения результатов запроса), что и в мэйнфреймах S/370 компании IBM. Поскольку Oracle была спроектирована как переносимая СУБД, она Использует свои внутренние форматы типов данных. Когда Oracle получает значения Параметров от программы или возвращает в программу результаты запроса, она автоматически проводит преобразования между внутренними форматами данных и Теми форматами, которые применяются в системе, на которой работает Oracle.



Используя область sqlda, программа может управлять преобразованием типов данных, выполняемым в Oracle. Предположим, например, следующее: программа описывает результаты динамического запроса с помощью инструкции describe и обнаруживает (по коду типа данных в области sqlda), что первый столбец содержит числовые данные. Программа может попросить выполнить преобразование числовых данных, изменяя код типа данных в области sqlda перед извлечением данных. Если программа поместит в область sqlda код типа данных, например для символьной строки, то Oracle выполнит преобразование первого столбца таблицы результатов запроса и возвратит его в программу как строку цифр.

Возможность преобразования типов данных в Oracle с помощью области sqlda обеспечивает отличную переносимость профамм как между разли11ными компьютерными системами, так и между различными языками профаммирования. Аналогичная возможность существует в нескольких других СУБД, но во всех СУБД компании IBM возможность преобразования типов данных отсутствует.

Динамический SQL и стандарт SQL2

Динамический SQL в стандарте SQL1 отсутствовал вовсе, поэтому стандартом де-факто для динамического SQL, как уже было сказано, стала его реализация в СУБД DB2 компании IBM. В стандарте SQL2 динамическому SQL посвящена отдельная глава объемом примерно 50 сфаниц. В отнощении наиболее простых аспектов стандарт SQL2 очень близок к тому динамическому SQL, который применяется в настоящее время в коммерческих СУБД. Но что касается других аспектов, включая даже базовые динамические запросы, новый стандарт несовместим с существующими СУБД. Чтобы уже разработанные программы соответствовали ему, их придется переписать. В следующих нескольких парафафах мы подробнее рассмофим особенности динамического SQL в стандарте SQL2, акцентируя внимание на отличиях от динамического SQL, применяемого в DB2 и описанного в предыд>тцих парафафах.

На практике динамический SQL, соответствующий стандарту SQL2, внедряется в коммерческие СУБД очень медленно, и старый динамический SQL, в стиле DB2, по-прежнему щироко используется в профаммировании. Даже если новая версия СУБД поддерживает стандарт SQL2, в ней всегда предусмафивается такой режим работы препроцессора, при котором он понимает старый динамический SQL, применяемый в данной СУБД Часто именно этот режим является режимом по умолчанию для препроцессора, так как необходимо, чтобы новые версии СУБД позволяли использовать тысячи и тысячи уже существующих профамм. Таким образом, реализация тех возможностей, предусмофенных стандартом SQL2, которые несовместимы с существующей практикой, будет медленным, эволюционным процессом.

Базовые динамические инструкции в SQL2

Синтаксические диафаммы базовых динамических инструкций (т.е. тех, которые не связаны с запросами на выборку) стандарта SQL2 изображены на рис. 18.18. Эти инсфукции очень близки к диалекту DB2. В частности, они поддерживают одно- и двухэтапное выполнение динамических инсфукций.



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

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