Дать информацию о структуре записи выборки данных
Назначение
Команда
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; }