Дать информацию о структуре записи выборки данных
Назначение
Команда
GETA
возвращает информацию о полях записей выборки данных.
Параметры вызова
inter(CBL, NULL, NULL, [CondBuf], RowBuf);
Входные данные
Входными данными является контрольный блок
CBL
.
В нем должны быть заполнены поля:
Имя поля | Значение | |
---|---|---|
NumChan
| Номер канала | |
Command
|
"GETA"
| |
RowId
| Порядковый номер поля записи выборки данных, начиная с которого выдавать структуру записи; отсчет порядковых номеров начинается с 0 | |
LnBufRow
| Длина буфера выборки данных | |
Node
| Имя ЛИНТЕР-сервера |
Выходные данные
Выходными данными являются:
-
контрольный блок
CBL
; -
буфер выборки данных
RowBuf
.
В контрольном блоке будут возвращены:
Имя поля | Значение | |
---|---|---|
CodErr
| Код завершения запроса к СУБД ЛИНТЕР | |
RowCount
| Количество полей в буфере выборки данных. Устанавливается даже в случае, когда в буфере выборки нет места для информации об одном поле | |
LnBufRow
| Фактическая длина буфера выборки данных | |
SysErr
| Код состояния ОС |
Информация в буфере выборки данных
RowBuf
будет представлена в виде массива, каждый элемент которого имеет
следующую структуру:
struct PACKED_ATTR GETA_OUT { L_CHAR User[MAX_ID_LEN]; /* Имя пользователя */ L_CHAR Table[MAX_ID_LEN]; /* Имя таблицы */ L_CHAR Column[MAX_ID_LEN]; /* Имя столбца */ #if _VER_MAX >= 500 L_WORD Length; /* Длина столбца */ L_BYTE Type; /* Тип данных столбца */ #else L_BYTE Type; /* Тип данных столбца */ L_BYTE Length; #endif L_BYTE Precision; /* Точность (для числовых данных */ /* типа Numeric) */ L_BYTE Scale; /* Масштаб (для данных типа Numeric) */ #if _VER_MAX >=500 L_BYTE Reserve; #endif #if _VER_MAX >=600 L_WORD CharSet; /* Идентификатор кодовой страницы */ #endif };
Коды возвращаемых в поле
Type
типов данных приведены в приложении
3.
Максимальный размер массива равен количеству полей в выборке данных.
Если количество полей велико, то возможно получение информации обо всех
столбцах порциями. Размер порции описания столбцов, полученной за
один раз, ограничивается длиной буфера и максимальным размером сообщения.
Реальное количество структур в порции можно вычислить по формуле:
Количество_Полей = LnBufRow/sizeof(GETA_OUT)
.
Если количество описаний полей в порции меньше количества полей в
выборке данных,
то для получения следующей порции информации о полях записи
необходимо повторно выдать
команду
GETA
, установив в поле
RowId
соответствующее значение.
Примечание
Для получения характеристик одного конкретного поля буфера выборки
данных надо в
LnBufRow
задать длину sizeof(GETA_OUT),
а в
RowId
– порядковый номер интересующего поля.
Описание
Если выборка данных была выполнена из представления, то имя схемы и имя таблицы будут содержать имя схемы и имя представления.
Если в SELECT-запросе имя таблицы или представления задано через псевдоним, то в буфере выборки данных в качестве имени таблицы (представления) будет помещено имя псевдонима.
Если поле буфера выборки данных является функцией или константой, то именем такого поля будут пробелы или псевдоним (если он задан).
В качестве типа данных полей, являющихся функциями, возвращается результирующий тип функции.
Типом данных константных полей является тип данных константы.
Коды завершения
Код | Описание | |
---|---|---|
NORMAL | Нормальное завершение | |
SMALLBUFKOR |
Недостаточный размер буфера выборки данных (невозможно поместить информацию даже об одном поле выборки данных) Примечание
Если
| |
EORR | Искомые данные не найдены (указан порядковый номер несуществующего поля записи) | |
ERRSEQCOM | Неправильная последовательность команд (команда |
Пример формирования команды
#include < string.h > #include < stdlib.h > #include "inter.h" L_LONG LinterGETA(TCBL * pCBL, L_WORD N, void *Out, L_WORD OutLen) { memcpy(pCBL- >Command, "GETA", 4); pCBL- >RowId = N; /* порядковый номер столбца */ pCBL- >LnBufRow = OutLen; pCBL- >PrzExe &= ~Q_ASYNC; inter(pCBL, NULL, NULL, NULL, Out); return pCBL- >CodErr; }
Примеры использования команды
-
Библиотечная функция получения количества полей в записи выборки данных.
#include < string.h > #include < stdlib.h > #include "inter.h" L_LONG LinterAnsColNum(TCBL * pCBL, L_WORD * N) { memcpy(pCBL- >Command, "GETA", 4); pCBL- >PrzExe &= ~Q_ASYNC; pCBL- >LnBufRow = 0; inter(pCBL, NULL, NULL, NULL, NULL); *N = (L_WORD) pCBL- >RowCount; return pCBL- >CodErr; }
-
Пример использования функции.
#include < stdio.h > #include < stdlib.h > #include < string.h > #include "inter.h" #include "exlib.h" #ifndef WINCE int main() #else int exgeta() #endif { TCBL CBLconnect; L_CHAR Name_Pass[] = "SYSTEM/MANAGER8"; L_CHAR Node[] = " "; L_WORD Priority = 0; L_LONG PrzExe = M_EXCLUSIVE | Q_ENCODE | M_BINARY; L_LONG Err; L_CHAR Query[] = "select NAME,FIRSTNAM,SEX from PERSON;"; GETA_OUT *answer; L_WORD NColumn; L_WORD i; memset(&CBLconnect,0,sizeof(TCBL)); Err = LinterOPEN(&CBLconnect, Name_Pass, Node, Priority, PrzExe); if (Err != NORMAL) PrintError(&CBLconnect); printf("Connect to RDBMS Linter\n"); Err = LinterSLCT(&CBLconnect, PrzExe, Query, NULL, L_MAXWORD, NULL); if (Err != NORMAL) PrintError(&CBLconnect); Err = LinterAnsColNum(&CBLconnect, &NColumn); if (Err != NORMAL) PrintError(&CBLconnect); printf("GETA (1), Answer Hold %d column\n", NColumn); answer = (GETA_OUT *) calloc(NColumn, sizeof(GETA_OUT)); if (answer == NULL) { printf("Error: not memory\n"); exit(1); } Err = LinterGETA(&CBLconnect, 0, answer, (L_WORD) (NColumn *sizeof(GETA_OUT))); if (Err != NORMAL) PrintError(&CBLconnect); printf("GETA (2):\n"); for (i = 0; i < NColumn; i++) { printf("Answer Column %d\n", i + 1); printf("\tUser=%.18s\n", answer[i].User); printf("\tTable=%.18s\n", answer[i].Table); printf("\tColumn=%.18s\n", answer[i].Column); printf("\tLength=%d\n", answer[i].Length); printf("\tType=%hd\n", answer[i].Type); printf("\tPrecision=%hd\n", answer[i].Precision); printf("\tScale=%hd\n\n", answer[i].Scale); } free(answer); printf("End Example\n"); return 0; }