Пакетное добавление данных

Назначение
 

Команда PUTM предназначена для добавления в таблицу или обновляемое представление БД группы записей (пакета). Добавление выполняется в тот объект БД, который указан в предварительно выданной SQL-команде START APPEND.

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

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

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

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

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

  • буфер записи RowBuf.

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

Имя поля Значение
NumChan Номер канала
Command "PUTM"
LnBufRow Размер пакета в байтах
Node Имя ЛИНТЕР-сервера

Пакет данных передается в буфере RowBuf.

Структура пакета данных:

  1. количество записей в пакете (2 байта);

  2. первая запись пакета;

  3. вторая запись пакета;

  4. последняя запись пакета.

Структура записи пакета данных:

  1. длина первого поля записи (2 байта), следом – значение поля;

  2. длина второго поля записи, следом – значение поля;

  3. длина N-го поля записи, следом – значение поля;

  4. длина последнего поля записи, следом – значение поля.

Значение поля для VAR типов (VARCHAR, VARBYTE, NVARCHAR) является комбинацией длины поля и его значения. То есть в пакете для этих полей должно стоять 2 длины по 2 байта подряд. Одно из них определяет общую длину поля, включая длину поля VAR типа, вторая длина – на 2 байта меньше и определяет только длину данных.

Примечания

  1. Если для поля типа VARCHAR указано преобразования типа BYTE, реально это поле передается ядру СУБД ЛИНТЕР не в байтовом формате, а в символьном, поэтому в этом случае должен быть сформирован префикс длины для значения полей типа VAR.

  2. Особенности формирования пакета данных в зависимости от его формата описаны в конструкции START APPEND в документе «СУБД ЛИНТЕР. Справочник по SQL», подраздел «Пакетное добавление».

  3. Для представления NULL-значений и значений по умолчанию указывается длина -1 и -2 соответственно. Значение поля в пакете при этом должно отсутствовать.

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

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

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

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

Максимальный размер пакета равен 8000 байт (если ядро СУБД ЛИНТЕР и клиентское приложение собраны без макроса LARGE_EXCHANGE) и 64000 байт, если они собраны с макросом LARGE_EXCHANGE (по крайней мере с этим макросом должен быть странслирован файл intlib.с, входящий в состав клиентского приложения либо непосредственно, либо через какую-то библиотеку). Все библиотеки, входящие в состав последних версий СУБД ЛИНТЕР, также собраны с макросом LARGE_EXCHANGE.

В следующих версиях СУБД способ задания размера буфера PUTM с помощью макроса может измениться.

Если неизвестно, каким способом задается размер буфера PUTM, то фактический размер определяется эмпирически.

Если в процессе загрузки пакета записей обнаружится ошибка добавления некоторой записи, то загрузка оставшейся части пакета прекращается. Поле RowCount в блоке CBL будет содержать фактическое число загруженных записей.

Пакетное добавление может выполняться в обновляемое представление.

При выполнении PUTM блокировка записей выполняется в соответствии с установленным режимом обработки транзакций. Если число заблокированных записей превысит 1024, то будет заблокирована вся таблица.

Команда выполняется только в контексте пакетного режима, поэтому перед началом пакетного добавления должен быть выполнен SQL-запрос START APPEND INTO…, окончание пакетного режима объявляется SQL-запросом END APPEND.

В пакетном режиме, кроме команды PUTM, разрешены команды COMT, RBAC, CLOS, KILL и SQL-команда END APPEND. Все другие команды запрещены.

Примечание

При пакетной вставке данных триггеры, настроенные на вставку данных, срабатывать не будут.

Код Описание
NORMAL Нормальное завершение
ERRSEQCOM Неправильная последовательность команд (команда PUTM подана вне контекста запроса START APPEND)
BADPACKET Неправильный пакет данных
Пример формирования команды
#include < string.h >
#include < stdlib.h >
#include "inter.h"

L_LONG LinterPUTM(TCBL *pCBL, void *RowBuf, L_WORD RowBufLen)
   {
   memcpy(pCBL- >Command, "PUTM", 4);
   pCBL- >LnBufRow=RowBufLen;
   pCBL- >PrzExe &= ~Q_ASYNC;
   inter(pCBL, NULL, NULL, NULL, RowBuf);
   return pCBL- >CodErr;
   }
Примеры использования команды
  1. #include < stdio.h >
    #include < stdlib.h >
    #include < string.h >
    #include "inter.h"
    #include "exlib.h"
    
    #define MAX_ROWS 50
    
    #ifndef WINCE
    int    main()
    #else
    int    exputm()
    #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_BYTE  PackBuf[4096];
       L_WORD  *Len;
       L_LONG i;
       L_WORD  size;
    
       memset(&CBLconnect,0,sizeof(TCBL));
       Err=LinterOPEN(&CBLconnect, Name_Pass, Node, Priority, PrzExe);
       if (Err != NORMAL)
         PrintError(&CBLconnect);
       printf("Connect to RDBMS Linter\n");
    
       LinterNotSelect(&CBLconnect, "drop table TT;");
       LinterNotSelect(&CBLconnect, "create table TT(CC int);");
    
    
       Len=(L_WORD *) (PackBuf+2);
       size=sizeof(L_WORD);;
       for (i=0; i <  MAX_ROWS; i++)
          {
          *Len=sizeof(L_LONG);
          memcpy(Len+1, &i, sizeof(L_LONG));
          Len += 1+sizeof(L_LONG)/sizeof(L_WORD);
          size += sizeof(L_LONG)+sizeof(L_WORD);;
          }
       *((L_WORD *) PackBuf)=(L_WORD) i;
    
       if(LinterNotSelect(&CBLconnect, "START APPEND INTO TT BYTE (CC);") != NORMAL)
         PrintError(&CBLconnect);
    
       Err=LinterPUTM(&CBLconnect, PackBuf, size);
       if (Err != NORMAL)
         PrintError(&CBLconnect);
       printf("PUTM\n");
    
       if (LinterNotSelect(&CBLconnect, "END APPEND INTO TT;") != NORMAL)
         PrintError(&CBLconnect);
    
       printf("End Example\n");
    
       return 0;
       }
    
  2. В приложении 10 приведены примеры пакетной обработки данных.