|
Программирование >> Sql: полное руководство
именованных параметров в динамически подготовленной инструкции. 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.
количество элементов в массивах 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. В частности, они поддерживают одно- и двухэтапное выполнение динамических инсфукций.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |