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

Назначение
 

Команда 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

Недостаточный размер буфера выборки данных (невозможно поместить информацию даже об одном поле выборки данных)

Примечание

Если LnBufRow == 0, то возвращается количество полей выборки RowCount и ошибочный код завершения не устанавливается

EORR

Искомые данные не найдены (указан порядковый номер несуществующего поля записи)

ERRSEQCOM

Неправильная последовательность команд (команда GETA подана вне контекста SELECT-запроса)

Пример формирования команды
#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;
  }
Примеры использования команды
  1. Библиотечная функция получения количества полей в записи выборки данных.

    #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;
      }
    
  2. Пример использования функции.

    #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;
      }