Приложение 1. Структура дескриптора t_sqlda

struct t_sqlda
{
    int N;            /* Число описателей динамических параметров */
    void(*DF)(void);  /* Зарезервировано */
    char **V;         /* Массив указателей на адреса главных переменных */
    int *L;           /* Указатель на массив, в котором хранятся длины главных переменных */
    short *T;         /* Массив указателей на типы главных переменных */
    int *D;           /* Массив указателей на размерности массивов главных переменных */
    short *P;         /* Значение точности для типов данных NUMERIC */
    short *SC;        /* Значение масштаба для типов данных NUMERIC */
    short *RL;        /* Массив длин формальных параметров */
    short *BL;        /* Массив реальных длин параметров */
    char **I;         /* Массив указателей на адреса индикаторных переменных */
    int F;            /* Количество переменных, реально найденных оператором SQL DESCRIBE */
    char **S;         /* Массив указателей на адреса имен главных переменных */
    short *M;         /* Указатель на максимальную длину имени */
    short *C;         /* Указатель на длину имени текущей переменной */
    char **X;         /* Массив указателей на адреса имен индикаторных переменных */
    short *Y;         /* Максимальная длина имени индикаторной переменной */
    short *Z;         /* Указатель на текущую длину имени индикаторной переменной */
    short *MN;        /* Указатель флага состояния */
    int NL;           /* Максимальное число описателей параметра в данном дескрипторе */
    int FR;           /* Дескриптор был использован оператором SQL DESCRIBE */
    int UD;
};

Описание полей дескриптора приведено в таблице П1.1.

Таблица П1.1. Описание полей дескриптора
ПолеОписание поля

N

Суммарное максимальное число входных или выходных описателей параметров в данном дескрипторе. Это значение устанавливается при выделении памяти для дескриптора и равно max_vars.

**V

Указатель на массив адресов буферов данных. Во время инициализации обнуляются элементы V[0] - V[N-1].

Для дескриптора SELECT LIST память под буферы должна быть выделена перед выполнением предложения EXEC SQL FETCH ... USING DESCRIPTOR…. Полученные данные сохраняются в V[i].

Для дескриптора BIND VARIABLES инициализация буферов должна быть проведена перед выполнением предложения EXEC SQL OPEN ... USING DESCRIPTOR…. Поиск входных переменных ведется в V[i].

*L

Указатель на массив, в котором содержатся длины фактических входных или выходных параметров, привязанных к формальным параметрам.

Для дескриптора SELECT LIST значение этого поля определяется в момент получения информации о структуре ответа при выполнении предложения EXEC SQL DESCRIBE.

Для дескриптора BIND значение этого поля должно быть определено перед открытием курсора командой EXEC SQL OPEN . . . USING DESCRIPTOR . . ...Это можно сделать с помощью присвоения адреса главной переменной полю V[i] дескриптора, например:

bind_dp- >V[i] = (char *)&Host_Var;

здесь Host_Var – главная переменная, описанная в секции объявлений переменных основного языка. Таким образом, привязка главных переменных к дескрипторам осуществляется с помощью функций основного языка C/C++, а не встроенного языка.

*T

Массив кодов типов данных формальных входных или выходных параметров. Типы данных – внутренние типы библиотеки PCI (см. таблицу 9).

*D

Массив указателей на размерности массивов главных переменных.

*P

Массив значений точности для параметров типа NUMERIC.

*SC

Массив значений масштаба для параметров типа NUMERIC.

*RL

Содержит длину формального параметра (для входного параметра).

*BL

Для внутреннего использования. Содержит реальную длину привязываемого параметра (после исключительной ситуации Err_TooLong).

**I

Массив адресов главных переменных, привязанных к индикатору.

F

Число параметров, обнаруженных во время грамматического разбора предложения в операторе SQL DESCRIBE. Если F меньше нуля, это означает, что размер дескриптора слишком мал для описания того количества переменных, которое встретилось при грамматическом разборе предложения для BIND VARIABLE дескриптора или при получении структуры ответа для SELECT LIST дескриптора.

**S

Массив указателей имен главных переменных, привязанных к параметрам.

*M

Указатель максимальной длины имени параметра.

Данный параметр устанавливается при инициализации дескриптора и равен max_name.

*C

Массив, в котором хранятся длины имен входных (после предложения EXEC SQL DESCRIBE BIND VARIABLES . . .) или выходных параметров запроса (после выполнения предложения EXEC SQL OPEN . . . USING DESCRIPTOR . . .).

**X

Массив указателей имен индикаторных переменных.

*Y

Указатель максимальной длины имени индикаторных переменных.

Данный параметр устанавливается при инициализации дескриптора и равен max_ind_name.

*Z

Массив указателей текущих длин имен индикаторных переменных.

*MN

Флаги состояния:

  • 0x1 – поле V[i] заполнено непосредственными данными (без привязки к переменной основного языка);

  • 0x2 – поле I[i] заполнено непосредственными данными (без привязки к переменной основного языка);

  • 0x4 – фактический параметр номер i привязан к формальному параметру;

  • 0x8 – параметр номер i не может принимать NULL-значение.

NL

Максимальное число описателей параметра в данном дескрипторе по умолчанию MAX ENTRIES.

Переменная NL – лимит количества переменных, описываемых дескриптором. Поле заполняется при инициализации дескриптора и не должно модифицироваться пользователем.

FR

Состояние описателя параметра:

  • 1 – описатель описан операторами SQL DESCRIBE или SET DESCRIPTOR;

  • 0 – описатель не описан.

UD

Способ задания описателя параметра:

  • 1 – описатель параметра задан пользователем;

  • 0 – описатель параметра задан исполняющей системой (библиотекой прекомпилятора).