Пакетное добавление данных
Назначение
Команда
PUTM
предназначена для добавления в таблицу или обновляемое
представление БД группы записей (пакета).
Добавление выполняется в тот объект БД, который указан в предварительно
выданной SQL-команде
START APPEND.
Параметры вызова
inter(CBL, NULL, NULL, [CondBuf], RowBuf);
Входные данные
Входными данными являются:
-
контрольный блок
CBL
; -
буфер записи
RowBuf
.
В контрольном блоке должны быть заполнены поля:
Имя поля | Значение | |
---|---|---|
NumChan
| Номер канала | |
Command
|
"PUTM"
| |
LnBufRow
| Размер пакета в байтах | |
Node
| Имя ЛИНТЕР-сервера |
Пакет данных передается в буфере
RowBuf
.
Структура пакета данных:
-
количество записей в пакете (2 байта);
-
первая запись пакета;
-
вторая запись пакета;
-
…
-
последняя запись пакета.
Структура записи пакета данных:
-
длина первого поля записи (2 байта), следом – значение поля;
-
длина второго поля записи, следом – значение поля;
-
длина N-го поля записи, следом – значение поля;
-
длина последнего поля записи, следом – значение поля.
Значение поля для VAR типов (VARCHAR, VARBYTE, NVARCHAR) является комбинацией длины поля и его значения. То есть в пакете для этих полей должно стоять 2 длины по 2 байта подряд. Одно из них определяет общую длину поля, включая длину поля VAR типа, вторая длина – на 2 байта меньше и определяет только длину данных.
Примечания
-
Если для поля типа VARCHAR указано преобразования типа BYTE, реально это поле передается ядру СУБД ЛИНТЕР не в байтовом формате, а в символьном, поэтому в этом случае должен быть сформирован префикс длины для значения полей типа VAR.
-
Особенности формирования пакета данных в зависимости от его формата описаны в конструкции START APPEND в документе «СУБД ЛИНТЕР. Справочник по SQL», подраздел «Пакетное добавление».
-
Для представления 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; }
Примеры использования команды
-
#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; }
-
В приложении 10 приведены примеры пакетной обработки данных.