Дать группу записей выборки данных
Назначение
Команда
GETM
возвращает записи выборки данных в виде порции из заданного
количества записей.
Параметры вызова
inter(CBL, VarBuf, NULL, [CondBuf], RowBuf);
Входные данные
Входными данными является контрольный блок
CBL
.
В нем должны быть заполнены поля:
Имя поля | Значение | |
---|---|---|
NumChan
| Номер канала | |
Command
|
"GETM"
| |
RowCount
| Количество требуемых записей | |
RowId
| Начальный номер требуемой порции записей | |
LnBufRow
| Длина буфера выборки данных | |
Node
| Имя ЛИНТЕР-сервера |
Примечания
-
Если RowId=0, то первой записью в порции будет следующая запись после текущей записи выборки.
-
Если RowCount=0, то в порции будет возвращено максимально возможное количество записей.
Выходные данные
Выходными данными являются:
-
контрольный блок
CBL
; -
буфер выборки данных
RowBuf
; -
буфер параметров
VarBuf
.
В контрольном блоке будут возвращены:
Имя поля | Значение | |
---|---|---|
CodErr
| Код завершения запроса к СУБД ЛИНТЕР | |
RowId
| Системный номер последней записи в полученном пакете данных | |
LnBufRow
| Фактическая длина буфера выборки данных | |
RowCount
| Реальное число выбранных записей | |
SysErr
| Код состояния ОС |
Буфер выборки данных
RowBuf
будет содержать порцию записей выборки данных.
В буфере
VarBuf
возвращается
маска NULL-значений.
Описание
После выполнения
GETM
в буфер
RowBuf
считывается
очередная порция записей выборки данных,
курсор позиционируется на последней выбранной по
GETM
записи.
Количество записей, выбираемых в данной порции, ограничивается
количеством данных в выборке,
размером буфера для сохранения порции
LnBufRow
, количеством запрашиваемых
данных
RowCount
(если != 0) и максимальным размером данных, передаваемых
интерфейсом (64 Kбайт минус накладные расходы). Реальное число
выбранных записей возвращается в поле
RowCount
.
Коды завершения
Код | Описание | |
---|---|---|
NORMAL | Нормальное завершение | |
SMALLBUFKOR | Недостаточный размер буфера выборки данных | |
EORR | Искомые данные не найдены (выборка данных пуста, или задан неправильный номер начальной записи) | |
ERRSEQCOM |
Неправильная последовательность команд (команда
GETM
подана вне контекста SELECT-запроса)
|
Пример формирования команды
#include < string.h > #include < stdlib.h > #include "inter.h" L_LONG LinterGETM(TCBL *pCBL, L_LONG Start, L_LONG N, void *RowBuf, L_WORD RowBufLen, void *NullBuf) { memcpy(pCBL- >Command, "GETM", 4); pCBL- >LnBufRow=RowBufLen; pCBL- >RowId=Start; /* start record, if RowId=0 then next *record */ pCBL- >RowCount=N; /* количество записей */ pCBL- >PrzExe &= ~Q_ASYNC; inter(pCBL, NullBuf, NULL, NULL, RowBuf); return pCBL- >CodErr; }
Пример использования команд для работы с выборкой данных
#include < stdio.h > #include < stdlib.h > #include < string.h > #include "inter.h" #include "exlib.h" #ifndef WINCE int main() #else int exgetx() #endif { struct TRowBuf { L_CHAR Name[20]; L_CHAR FirstName[15]; L_CHAR Sex; }; typedef struct TRowBuf TRowBuf; 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;"; L_WORD i; TRowBuf RowBuf; #define M 5 TRowBuf MRowBuf[M]; 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,&RowBuf, sizeof(TRowBuf), NULL); if (Err != NORMAL) PrintError(&CBLconnect); printf("Select\n"); Err=LinterGETF(&CBLconnect, &RowBuf, sizeof(TRowBuf), NULL); if (Err != NORMAL) PrintError(&CBLconnect); printf("GETF:\n"); printf("%.20s %.15s %c\n\n", RowBuf.Name, RowBuf.FirstName, RowBuf.Sex); Err=LinterGETN(&CBLconnect, &RowBuf, sizeof(TRowBuf), NULL); if (Err != NORMAL) PrintError(&CBLconnect); printf("GETN:\n"); printf("%.20s %.15s %c\n\n", RowBuf.Name, RowBuf.FirstName, RowBuf.Sex); Err=LinterGETL(&CBLconnect, &RowBuf, sizeof(TRowBuf), NULL); if (Err != NORMAL) PrintError(&CBLconnect); printf("GETL:\n"); printf("%.20s %.15s %c\n\n", RowBuf.Name, RowBuf.FirstName, RowBuf.Sex); Err=LinterGETS(&CBLconnect, 5, &RowBuf, sizeof(TRowBuf), NULL); if (Err != NORMAL) PrintError(&CBLconnect); printf("GETS:\n"); printf("%.20s %.15s %c\n\n", RowBuf.Name, RowBuf.FirstName, RowBuf.Sex); Err =LinterGETM(&CBLconnect,1,M,&MRowBuf, sizeof(TRowBuf)*M, NULL); if (Err != NORMAL) PrintError(&CBLconnect); printf("GETM:\n"); for (i=0; i < M; i++) printf("%.20s %.15s %c\n", MRowBuf[i].Name, MRowBuf[i].FirstName, MRowBuf[i].Sex); printf("\n"); printf("End Example\n"); return 0; }