|
Программирование >> Sql: полное руководство
Например, следующие инструкции передают в буфер строку символов переменной ддины и указывают ее реальную длину: length = strlen (mbuf) ; SET DESCRIPTOR parmdesc VALUE ( :] + 1) DATA = : mbuf; SET DESCRIPTOR parmdesc VALUE (:] +1) LENGTH = :length; Если указание длины элемента данных не требуется, то передача данных упро-шается, т.к. в этом случае необходима только одна инструкция set descriptor. Следует также отметить, что стандарт SQL2 подразумевает неявное приведение типов данных базовых переменных (таких как mbuf) к типам данных SQL. Следуя стандарту SQL1, программа, представленная на рис 18.8, вынуждена была выполнять все эти преобразования в функциях sscanf () Вместо этого в SQL2 данные можно передать в СУБД в символьном виде, что позволит выполнить автоматическое преобразование и обнаружить возможные ошибки Теперь, когда область sqlda сформирована требуемым образом, программа (рис 18.8) выполняет динамическую инструкцию update с помощью инструкции execute, обозначенной цифрой 9. При использовании дескриптора стандарта SQL2 эта инструкция преобразуется довольно просто и принимает следующий вид: EXECUTE updatestmt USING SQL DESCRIPTOR parmdesc; Ключевые слова в инструкции execute изменяются незначительно, а вместо имени области sqlda задается имя дескриптора. И наконец, следует выполнить еще одну модификацию программы, представленной на рис. 18.8- освободить ресурсы, занятые дескриптором Это делается посредством следующей инструкции DEALLOCATE DESCRIPTOR parmdesc; В простой программе (такой как профамма, представленная на рис. 18.8) в освобождении ресурсов нет особой необходимости. Но в сложных реальных профаммах со множеством дескрипторов будет весьма разумно освобождать ресурсы, занятые дескрипторами, когда они больше не требуются профамме. Стандарт SQL2 и динамические запросы на выборку в предыдущем парафафе дескриптор стандарта SQL2, как и заменяемая им область sqlda, использовался в динамических инструкциях SQL для передачи из базовой программы в СУБД парамефов, необходимых для выполнения динамической инструкции. Стандартом SQL2 также предусмотрено использование дескрипторов в динамических запросах на выборку, где, подобно области sqlda, они управляют передачей результатов запросов из СУБД в базовую профамму. На рис 18.9 изображена программа, выполняющая динамические запросы к СУБД DB2. Будет полезно рассмотреть, как следует преобразовать эту программу для того, чтобы она удовлетворяла требованиям стандарта SQL2. Общая структура профаммы остается такой но, опять-таки, в нее будет внесено много мелких изменений. Варианты инструкций, связанных с выполнением динамических запросов на выборку и соответствующих стандарту SQL2, представлены на рис. 18.20. DESCRIBE -OUTPUT - - INPUT- j- DECLARE имя на6ора записей [- ALLOCATE имя на6ора записей I- OPEN имя набора записей FETCH тя набора записей CLOSE имя на6ора записвй имя инструтии USING SQL DESCRIPTOR имя авскриптора - INSENSITIVE- SCROLL-J -CURSOR FOR иш инструкции - INSENSITIVE- >- SCROLL -CURSOR FOR имя инструкции - USING -т-базоваяпеременная I- USING SQL DESCRIPTOR имя дескриптора - INTO-T-базовая переменная - INTO SQL DESCRIPTOR имя дескриптора Рис. 18.20. Инструкции SQL2, предназначенные для обработки динамических запросов на выборку Объявление набора записей для динамического запроса, обозначенное на рис. 18.9 цифрой 1, не изменяется. Формирование динамической инструкции select (обозначено цифрой 2) и инструкция prepare (обозначсна цифрой 3) также остаются без изменений. Изменения в программе начинаются с инструкции describe (обозначена цифрой 4), возвращающей описание таблицы результатов запроса в область sqlda с именем qry da. Эта инструкция должна быть модифицирована так, чтобы в ней была ссылка на предварительно выделенный дескриптор. Предположим, что имя дескриптора qrydesc; тогда новые инструкции будут иметь следующий вид: ALLOCATE DESCRIPTOR qrydesc WI?>a MAX : colcount; DESCPIBE querystmt USING SQL DESCRIPTOR qrydesc; Инструкция describe стандарта SQL2 действует подобно замененной ею инструкции, только описания столбцов таблицы результатов запроса один за другим возвращаются в дескриптор, а не в область sqlda. Так как дескриптор принадлежит СУБД и не является структурой данных, находящейся внутри программы, базовая программа должна извлекать информацию из дескриптора Эту функцию выполняет инструкция get descriptor, в отличие от инструкции set descriptor, заносящей в дескриптор информацию В программе, представленной на рис. 18.9, инструкция, обозначенная цифрой 5 и получающая из области sqlda длину отдельного столбца таблицы результатов запроса, должна быть заменена следующими инструкциями: GET DESCRIPTOR qrydesc VALUE (:i + 1) :length = LENGTH; qry var->sqldata = malloc(length); Выделение буферов для каждого элемента таблицы результатов запроса по-прежнему необходимо, но способ передачи в СУБД адресов этих буферов в SQL2 меняется. Теперь эти адреса помещаются не в область sqlda, а в дескриптор с помощью инструкции зет descriptor. Буферы для переменггых-индикаторов не требуются. Информацию о том, может ли столбец содержать значения null, можно получать из дескриптора непосредственно в процессе выборки каждой записи, как будет показано ниже В данном примере число столбцов таблицы результатов запроса подсчитывается программой при формировании запроса. Но программа может также извлечь число столбцов из дескриптора с помощью следующей инструкции get descriptor GET DESCRIPTOR qrydesc :colcount = COUNT; После получения описания таблицы результатов запроса программа выполняет запрос, открывая набор записей. Простая форма инструкции open (обозначена цифрой 6) без каких-либо входных параметров соответствует стандарту SQL2. Если в динамическом запросе имеются параметры, они могут быть переданы в СУБД либо посредством базовых переменных, либо через дескриптор Инструкция open стандарта SQL2, использующая базовые переменные, идентична инструкции open в DB2, приведенной на рис. 18.13. Инструкция open стандарта SQL2, использующая дескриптор, подобна инструкции execute стандарта SQL2, также использующей дескриптор, и отличается от инструкции open в DB2. Например, инструкция open, изображенная на рис. 18.14: OPEN qrycursor USING DESCRIPTOR parmda; заменяется по стандарту S0L2 следующей инструкцией open: OPEN qrycursor USING SQL DESCRIPTOR parmdesc; Методика передачи входных параметров в инструкцию open через дескриптор такая же самая, как и описанная ранее для инструкции execute. Подобно СУБД Oracle, стандарт SQL2 предоставляет базовой программе возможность получать как описание параметров динамического запроса, так и описание таблицы результатов запроса. Для фрагмента программы, приведенного на рис. 18.14, следующая инструкция describe: DESCRIBE INPUT querystmt USING SQL DESCRIPTOR parmdesc; возвратит в дескриптор (с именем parmdesc) описание всех параметров динамического запроса Число параметров может быть выяснено с помощью инструкции get descriptor, извлекающей из дескриптора элемент count. Как и СУБД Oracle, стандарт SQL2 допускает существование двух дескрипторов, связанных с динамическим запросом. Входной дескриптор, получаемый с помощью инструкции describe Input, содержит описание параметров запроса. Выходной дескриптор содержит описание столбцов таблицы результатов запроса. Стандарт позволяет явно задавать выходной дескриптор: ESCRIBE OUTPUT querystmt USING SQL DESCRIPTOR qrydesc; По инструкция describe по умолчанию сама извлекает выходное описание, поэтому Ключевое слово output обычно опускается.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |