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

1 ... 160 161 162 [ 163 ] 164 165 166 ... 264


Вернемся к программе, представленной на рис. 18.9. Инструкция open, обозначенная цифрой 6, открыла набор записей, и теперь инструкция fetch, обозначенная цифрой 7, извлекает строки из таблицы результатов запроса. Для соответствия стандарту SQL2 эта инструкция должна быть слегка модифицирована:

FETCH sqlcurs USING SQL DESCRIPTOR qrydesc;

Инструкция fetch продвигает указатель набора записей на следующую строку таблицы результатов запроса и помещает все элементы этой строки в дескриптор, откуда программа может их затем извлечь. Программа по-прежнему должна получать дополнительную информацию о каждом столбце, в частности его длину и может ли он содержать значения null. Например, определить длину столбца, содержащего символьные данные, программа может посредством следующей инструкции:

GET DESCRIPTOR qrydesc VALUE {:i + 1) : length = RETURNED LENGTH;

Чтобы выяснить, содержится ли в столбце значение null, следует воспользоваться такой инструкцией:

GET DESCRIPTOR qrydesc VALUE (:i + 1) :indbuf = INDICATOR;

a определить тип данных столбца можно так:

GET DESCRIPTOR qrydesc VALUE (:i + 1) :type = TYPE;

Как видите, построчная обработка результатов запроса внутри цикла for этой программы будет осуществляться совершенно иначе, чем в программе, представленной на рис. 18 9

Обработав все строки таблицы результатов запроса, профамма закрывает набор записей Инсфукция close (на рис. 18.9 она обозначена цифрой 8) соответствует стандарту SQL2 и потому не изменяется. После закрытия набора записей хорошей фадицией является освобождение всех дескрипторов, созданных в начале профаммы.

Изменения, которые необходимо произвести в профаммах динамического SQL, изображенных на рис 18.8, 18.9 и 18.14, для того чтобы они соответствовали стандарту SQL2, детально иллюстрируют особенности нового стандарта и степень его отличия от динамического SQL, общеупотребительного в настоящее время. Вкратце, отличия динамического SQL стандарта SQL2 от динамического SQL, применяемого в DB2, таковы:

Сфуктура данных sqlda заменяется дескриптором, которому присваивается имя.

Для создания и удаления дескрипторов служат инструкции allocate descriptor и deallocate descriptor. Они заменяют собой операции выделения памяти для области sqlda и освобождения этой памяти.

Профамма передает информацию и значения парамефов в СУБД с помошью инсфукции set descriptor, а нс использует для этой цели область sqlda.

Программа получает информацию о таблице результатов запроса и сами данные из этой таблицы с помощью инструкции get descriptor, а не использует для этого область sqlda.

Инструкция describe применяется для получения описаний как таблицы результатов запроса (describe output), так и входных параметров запроса (describe input).

Инструкции execute, open И fetch незначительно модифицируются; в них задается имя дескриптора вместо имени области sqlda.



Резюме

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

Простота. Статический SQL относительно прост; даже самый сложный его элемент - наборы записей - можно легко освоить, вспомнив концепцию файлового ввода/вывода. Динамический SQL довольно сложен, в нем осуществляется динамическое формирование инструкций, используются структуры данных переменной длины и выполняется распределение памяти.

Производительность. Во время компиляции программы, использующей статический SQL, создается план выполнения всех встроенных инструкций; инструкции динамического SQL компилируются непосредственно на этапе выполнения. В результате производительность статического SQL, как правило, намного выше, чем динамического.

Гибкость. Динамический SQL дает программе возможность решать на этапе выполнения, какие конкретно инструкции SQL она будет выполнять. Статический SQL требует, чтобы все инструкции SQL были написаны заранее, на этапе создания программы; тем самым он офаничивает гибкость программы. Функциональные возможности динамического SQL реализуются с помошью

набора расширенных встроенных инструкций SQL:

Инструкция execute immediate обеспечивает передачу текста динамической инструкции SQL в СУБД, которая немедленно ее выполняет.

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

Инсфукция execute дает СУБД команду выполнить динамическую инсфукцию, скомпилированную ранее инсфукцией prepare, а также передает значения параметров для выполняемой инсфукции.

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

Инструкция declare cursor Определяет набор записей для запроса на выборку по имени, которое было присвоено запросу, когда он компилировался инструкцией prepare.

Инструкция open передает значения парамефов, необходимых для выполнения динамической инструкции select, и дает СУБД команду начать ее выполнение.

Инсфукция fetch извлекает сфоку из таблицы результатов запроса и помещает ее элементы в профаммные буферы, указанные в области sqlda.

Инсфукция close прекращает доступ к таблице результатов запроса









Интерфейсы программирования приложений



1 ... 160 161 162 [ 163 ] 164 165 166 ... 264

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