Поиск и выборка данных

Назначение
 

Команда SLCT позволяет приложению послать к СУБД поисковый запрос и получить в ответ найденную в БД информацию.

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

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

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

Входными данными являются:

  • контрольный блок CBL;

  • буфер оператора OpBuf.

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

Имя поля Значение
NumChan Номер канала
Command "SLCT"
LnBufRow Длина буфера выборки данных
Node Имя ЛИНТЕР-сервера
PrzExe Режим обработки запроса

Буфер оператора OpBuf должен содержать текст SELECT-запроса.

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

Выходными данными являются:

  • контрольный блок CBL;

  • буфер выборки данных RowBuf;

  • буфер параметров VarBuf.

В контрольном блоке будут возвращены:

Имя поля Значение
CodErr Код завершения запроса к СУБД ЛИНТЕР
RowId Системный номер первой выбранной записи
RowCount Число найденных записей
LnBufRow Фактическая длина выбранной записи выборки данных
SysErr Код состояния ОС

Примечание

Значение поля RowId однозначно определяет системный номер выбранной записи только в случае выборки из одной таблицы. В случае запроса, который выбирает записи из нескольких множеств, значение RowId неоднозначно и будет установлено в 0.

Буфер выборки данных RowBuf будет содержать первую запись выборки данных.

В буфере VarBuf возвращается маска NULL-значений, представленная в следующем виде:

L_WORD K1;      /* Количество записей в порции выборки данных */
L_WORD K2;      /* Количество полей в записи выборки данных */
L_BYTE [K1*K2]; /* По одному байту на каждое поле */
                /* записи выборки данных */
/* Нулевое значение байта соответствует определенному */
/* значению поля, значение 1 – неопределенному (NULL-значение) */
Описание

При обработке SELECT-запроса СУБД ЛИНТЕР полностью выбирает из БД все найденные записи, однако в приложение передается только первая найденная запись. Дальнейшая работа с записями осуществляется с помощью команд:

  • GETA – дать информацию о структуре записи выборки данных;

  • GETF – дать первую запись выборки данных;

  • GETL – дать последнюю запись выборки данных;

  • GETN – дать следующую запись выборки данных;

  • GETP – дать предыдущую запись выборки данных;

  • GETS – дать указанную запись выборки данных;

  • GETM – дать несколько записей за одно обращение.

Примечание

СУБД ЛИНТЕР «не знает» реальной границы программных буферов приложения и при размещении записи в буфере выборки данных руководствуется только полученным значением LnBufRow. Поэтому, если заданное значение LnBufRow больше фактической длины буфера выборки данных, то часть записи может быть размещена за пределами буфера выборки данных, запортив при этом данные и/или программный код приложения.

Код Описание
NORMAL Нормальное завершение
SMALLBUFKOR Недостаточный размер буфера выборки данных
EORR Искомые данные не найдены
Целочисленное значение Коды завершения, вызванные синтаксическими или семантическими ошибками поданного SELECT-запроса (см. документ «СУБД ЛИНТЕР. Справочник кодов завершения», подраздел «Коды завершения выборки данных (1-3)»)
Пример формирования команды
#include < string.h >
#include < stdlib.h >
#include "inter.h"

L_LONG LinterSLCT(TCBL * pCBL, L_LONG PrzExe, L_CHAR * Statement, void *RowBuf, L_WORD RowBufLen, void *NullBuf)
  {
  memcpy(pCBL- >Command, "SLCT", 4);
  pCBL- >PrzExe = PrzExe;
  pCBL- >LnBufRow = RowBufLen;
  pCBL- >PrzExe &= ~Q_ASYNC;
  inter(pCBL, NullBuf, Statement, 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    exslct()
#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;";
  TRowBuf RowBuf;

  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("First Selected Row:\n");
  printf("%.20s %.15s %c\n", RowBuf.Name, RowBuf.FirstName, RowBuf.Sex);

  printf("End Example\n");

  return 0;
  }