Дать группу записей выборки данных

Назначение
 

Команда GETM возвращает записи выборки данных в виде порции из заданного количества записей.

Параметры вызова

inter(CBL, VarBuf, NULL, [CondBuf], RowBuf);

Входные данные

Входными данными является контрольный блок CBL.

В нем должны быть заполнены поля:

Имя поля Значение
NumChan Номер канала
Command "GETM"
RowCount Количество требуемых записей
RowId Начальный номер требуемой порции записей
LnBufRow Длина буфера выборки данных
Node Имя ЛИНТЕР-сервера

Примечания

  1. Если RowId=0, то первой записью в порции будет следующая запись после текущей записи выборки.

  2. Если 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;
}