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

1 ... 153 154 155 [ 156 ] 157 158 159 ... 264


области sqlda. в противном случае СУБД заполняет данными по одной структуре 2QLVAR для каждого столбца таблицы результатов запроса в порядке их следования слева направо. Каждая структура sqlvar состоит из следующих полей, описывающих соответствующий столбец;

Поле sqlname содержит имя столбца и, в свою очередь, состоит из двух полей; в поле data содержится собственно имя, а в поле length - длина имени Если столбец является производным от выражения, то поле sqlname не используется.

Поле sqltype содержит целочисленный код типа данных столбца. Коды типов данных, используемые в различных СУБД, отличаются друг от друга. Как видно из табл. 18.1, коды типов данных в СУБД компании IBM указывают не только сам тип, но и то, допустимы ли в столбце значения null.

Поле sqllen содержит длину данных столбца. Для типов данных переменной длины (таких как varchar) указывается максимально возможная длина данных в столбце; длина данных в любой строке этого столбца не должна превыщать указанное значение. В DB2 (и многих других СУБД) значение, соответствующее типу decimal, включает как точность десятичного числа (в старшем байте), так и его степень масштабирования (в младшем байте).

СУБД не заполняет поля sqldata и sqlind. Прикладная профамма записывает в эти поля адреса буфера данных и переменной-индикатора столбца перед тем, как позднее использовать область sqlda в инсфукции fetch.

Таблица 18.1. Коды типов донных в СУБД DB2

Тип данных Значения NULL разрешены Значения NULL не разрешены

CHAR 452 453

VARCHAR 449

LONG VARCHAR 456 457

SMALLINT 500 501

INTEGER 495 497

FLOAT 480 481

DECIMAL 484 485

ATE 384 385

TIME 388 389

TIMESTAMP 392 393

GRAPHIC 468 469

VARGRAPHIC 464 465

Сложность применения инсфукции describe заключается в том, что профамма может не знать заранее, сколько столбцов будет содержать таблица результатов запроса, и, соответственно, не будет знать, насколько большой должна быть область sqlda, чтобы в ней уместились все описания. Чтобы обеспечить достаточно большой размер области sqlda, обычно пользуются одним из трех способов- При формировании списка извлекаемых столбцов профамма может подсчитывать их количество. Затем профамма может создать область sqlda с таким числом структур sqlvar, которое необходимо для получения описаний столбцов. Этот способ применяется в профамме, представленной на рис. 18.9.



Ш Если программе неудобно подсчитывать количество извлекаемых элементов, она может выполнить инструкцию describe, используя минимальную область sqlda (с одной структурой sqlvar). Когда инструкция describe возвращает результат поле sqld содержит число столбцов, имеющихся в таблице результатов запроса Теперь программа может создать область sqlda необходимого размера и повторно выполнить инструкцию describe, указывая новую область sqlda. Нет никаких Офаничений на число выполнений инструкции describe для одной подготовленной инсфукции.

Профамма может создать область sqlda с массивом сфуктур sqlvar, достаточно большим для типичного запроса. В большинстве случаев инсфукция describe использующая такую область, будет успешно выполняться. Если область sqlda окажется слишком маленькой, то в поле sqld будет содержаться информация о требуемом размере Тогда программа может создать еще большую область sqlda и повторно вьшолнить инсфукцию describe, используя новую область.

Инструкция describe обычно применяется для вьшолнения динамических запросов, но с ее помощью можно получить описание любой предварительно подготовленной инструкции. Это полезно, например, в том случае, когда профамме требуется выполнить неизвестную инструкцию SQL, введенную пользователем. Профамма может выполнить инсфукции prepare и describe, а затем извлечь содержимое поля sqld в области sqlda. Если значение в этом поле равно нулю, то это означает, что инструкция не является запросом на выборку и ее можно выполнить с помошью инструкции execute. Если в поле sqld содержится положительное число, то инструкция представляет собой запрос на выборку и для ее выполнения необходимо применить последовательность инсфукций open/fetch/close.

Динамическая инструкция DECLARE CURSOR

Динамическая инструкция declare cursor, синтаксическая диаграмма которой изображена на рис. 18.11, является разновидностью статической инсфукции declare cursor. Вспомним (см. главу 17), что в статической инсфукции declare cursor запрос задан явно, как одно из предложений инструкции. В противоположность этому, в динамической инструкции declare cursor запрос задан неявно в виде имени инструкции (связанной с запросом посредством инсфукции prepare)

declare имя на6ора записей cursor for имя инструкции--

Рис. 18.11. 01нтоксичеаазя диаграмма инсгрукции DECLARE CURSOR

Динамическая инструкция declare cursor, как и ее статический аналог, является не исполняемой инсфукцией, а директивой препроцессора SQL. В профамме она должна стоять раньше любой ссылки на объявляемый ею набор записей Имя набора записей, объявленное этой инструкцией, используется последующими инструкциями open, fetch и close для обработки результатов динамического запроса.

Динамическая инструкция OPEN

Динамическая инсфукция open, синтаксическая диафамма которой изображена на рис. 18.12, является разновидностью статической инсфукции open. Она дает



СУБД команду начать выполнение запроса и устанавливает указатель набора записей в позицию, предшествующую первой строке таблицы результатов запроса. После выполнения инструкции open набор записей остается в открытом состоянии и может быть использован инструкцией fetch.

[.- OPEN имя набора записей

USING

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

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

Рис. 18.12. Синтаксическая диаграмма инструкции OPEN

Роль инструкции open для динамических запросов аналогична роли инструкции execute для выполнения других динамических инструкций SQL. Как инструкция execute, так и инструкция open дзет СУБД команду выполнить инструкцию, предварительно скомпилированную инструкцией prepare. Если текст динамического запроса содержит маркеры параметров, то инструкция open, как и инструкция execute, должна передать в СУБД значения этих параметров. Для передачи параметров используется предложение using, и оно имеет одинаковый формат как в инструкции execute, так и в инструкции open.

Если число параметров динамического запроса известно заранее, профамма может передать в СУБД значения парамефов с помощью списка базовых переменных, содержащегося в предложении using инструкции open. Так же как и в инструкции execute, число базовых переменных должно соответствовать числу параметров, типы базовых переменных должны быть совместимыми с типами данных соответствующих параметров, и, если необходимо, должны быть заданы переменные-индикаторы. На рис. 18.13 представлен фрагмент профаммы, в которой динамический запрос имеет фи парамефа, чьи значения могут быть переданы с помощью базовых переменных.

/* Программа уже сформировала и подготовила следующую инструкцию SELECT: SELECT А, В, С FROM SALESREPS WHERE SALES BETWEEN ? AND ? с двумя параметрами

♦/

/* Запросить у пользователя минимальное и максимальное значения и выполнить запрос

ormcf ( Введите нижний предел объема продаж: ); scanf( %f , slow end);

printf( Введите верхний предел объема продаж: ); scanf( %f , &high end);

/* Открыть набор записей, чтобы начать запрос и передать параметры */ exec sql open qrycursor using ;low end, :high end;

Рис. 18.13, Инструкция OPEN с базовыми переменными



1 ... 153 154 155 [ 156 ] 157 158 159 ... 264

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