Буфер записи (буфер выборки данных) RowBuf
Буфер
RowBuf
предназначен для размещения в нем записей (выборки данных),
получаемых при обработке SELECT-запроса. Записи в
RowBuf
могут передаваться в двоичном формате или в специфицированном. Вид
представления записей устанавливается в поле
PrzExe
контрольного блока: значение M_BINARY (M_SPEC)
задает представление выборки данных без спецификаций (со спецификациями)
полей записи.
Использование значения M_BINARY (без спецификаций полей записи) предполагает знание структуры хранимой в БД информации. Такой формат выборки данных называется неспецифицированным (таблицы 3 и 4). В этом случае буфер выборки данных можно описать как структуру (с жестким типом), которая будет заполнена реальной информацией после завершения обработки запроса.
Примечание
При использовании для выборки данных структур данных необходимо помнить, что СУБД ЛИНТЕР подготавливает записи выборки данных в упакованном виде, т.е. без выравнивания полей, каждое следующее поле начинается с байта, непосредственно следующего за концом предыдущего поля.
При задании значения M_SPEC (со спецификациями полей записи) в буфер выборки данных данные помещаются вместе с их спецификацией – указанием типа данных и длины (таблица 5). Этот формат представления удобно использовать в тех случаях, когда приложение определяет структуру данных и генерирует запрос на их выборку в процессе выполнения.
Такой формат выборки данных называется специфицированным.
Специфицированный формат выборки данных удобен в том случае, когда запросы прикладной программы разнообразны (а, возможно, генерируются), и трудно отследить состав полей буфера выборки данных.
Тип данных в БД | Тип данных в C/C++ | Возвращаемое в буфере выборки данных значение |
---|---|---|
CHAR(N) |
char data[N]
| Последовательность ASCII-символов, дополненная справа пробелами до ширины поля |
VARCHAR(N) |
struct { L_WORD len; char data[N]; } | Первые 2 байта – длина значения, далее последовательность ASCII-символов |
BYTE(N) |
char data[N]
| Последовательность байтов, дополненная справа двоичными нулями до ширины поля |
VARBYTE(N) |
struct { L_WORD len; char data[N]; } | Первые 2 байта – длина значения, далее – последовательность байтов |
NCHAR(N) |
L_WORD data[N]
| Последовательность шестнадцатеричных значений UNICODE-символов, дополненная справа пробелами до ширины поля |
NCHAR VARYING(N) |
struct { L_WORD len; L_WORD data[N]; } | Первые 2 байта – длина значения, далее последовательность шестнадцатеричных значений UNICODE-символов. Длина равна 2*N, где N – число символов UNICODE |
DECIMAL, NUMERIC | Прямого соответствия нет | 16 байт (см. файл decimals.h и документ «СУБД ЛИНТЕР. Библиотеки специальных типов данных», раздел «Библиотека Decimals») |
BIGINT | В 64-разрядных ОС long long/__int64 | 8-байтовое знаковое целое (от -9 223 372 036 854 775 808 до +9 223 372 036 854 775 807) (см. L_DLONG в файле int64.h) |
INT | В 32-разрядных ОС long, в некоторых 64-разрядных ОС – int | 4-байтовое знаковое целое (от -2 147 483 648 до +2 147 483 647) (см. L_LONG в файле lintypes.h) |
SMALLINT | short | 2-байтовое знаковое целое (от -32 768 до +32 767) (см. L_WORD в файле lintypes.h) |
REAL | float | 4-байтовое число с плавающей точкой |
DOUBLE PRECISION | double | 8-байтовое число с плавающей точкой |
DATE | Прямого соответствия нет | 16 байт, соответствует типу данных DECIMAL СУБД ЛИНТЕР (см. файл decimals.h и документ «СУБД ЛИНТЕР. Библиотеки специальных типов данных», раздел «Библиотека Decimals») |
BOOLEAN |
char[1]
| 1 байт |
BLOB | Прямого соответствия нет | Описатель BLOB-данных (24 байта) (структура BLOB_ATR;) |
EXTFILE |
struct { L_LONG filterid; L_BYTE indextime[6]; char filename[512]; } | Описание внешнего файла (522 байта) |
Тип данных в БД |
Тип данных в СУБД ЛИНТЕР |
Возвращаемое в буфере выборки данных значение |
---|---|---|
Псевдостолбцы | ||
USER | DT_CHAR | CHAR(MAX_ID_LEN) |
SYSDATE | DT_DATE | DATE |
LAST_ROWID | DT_INTEGER | INTEGER |
ROWNUM | DT_INTEGER | INTEGER |
ROWID | DT_INTEGER | INTEGER |
ROWTIME | DT_DATE | DATE |
LAST_AUTOINC | DT_INTEGER | INTEGER |
LEVEL | DT_INTEGER | INTEGER |
LINTER_NAME_LENGTH | DT_INTEGER | INTEGER |
TRIGGER_INFO_SIZE | DT_INTEGER | INTEGER |
AUD_OBJ_NAME_LEN | DT_INTEGER | INTEGER |
PROC_INFO_SIZE | DT_INTEGER | INTEGER |
PROC_PAR_NAME_LEN | DT_INTEGER | INTEGER |
Литералы | ||
Строковый | DT_CHAR | CHAR |
Байтовый | DT_BYTE | BYTE |
UNICODE | DT_NCHAR | NCHAR |
Вещественный | DT_REAL | DOUBLE |
С фиксированной точкой | DT_REAL, DT_DECIMAL | DECIMAL (если помещается), иначе DOUBLE |
Размер буфера для представления NULL-значения СУБД ЛИНТЕР равен длине непустого значения соответствующего типа, а содержимое этого буфера может быть любым. Для идентификации NULL-значений используется дополнительный массив – маска NULL-значений.
Поле | Тип поля | Содержание |
---|---|---|
Number_Of_Field | L_WORD | Число полей в записи буфера выборки данных |
Len_Field1 | L_WORD | Длина 1-го поля в записи буфера выборки данных |
Type_Field1 | L_BYTE | Тип 1-го поля в записи буфера выборки данных |
Precision_Field1 | L_BYTE | Точность 1-го поля в записи буфера выборки данных |
Scale_Field1 | L_BYTE | Масштаб 1-го поля в записи буфера выборки данных |
Reserv_Field1 | L_BYTE | Резерв |
CharSet1 | L_WORD | Номер кодовой страницы |
Len_Field2 | L_WORD | Длина 2-го поля в записи буфера выборки данных |
Type_Field2 | L_BYTE | Тип 2-го поля в записи буфера выборки данных |
Precision_Field2 | L_BYTE | Точность 2-го поля в записи буфера выборки данных |
Scale_Field2 | L_BYTE | Масштаб 2-го поля в записи буфера выборки данных |
Reserv_Field2 | L_BYTE | Резерв |
CharSet2 | L_WORD | Номер кодовой страницы |
... | ... | ... |
Len_FieldN | L_WORD | Длина N-го поля в записи буфера выборки данных |
Type_FieldN | L_BYTE | Тип N-го поля в записи буфера выборки данных |
Precision_FieldN | L_BYTE | Точность N-го поля в записи буфера выборки данных |
Scale_FieldN | L_BYTE | Масштаб N-го поля в записи буфера выборки данных |
Reserv_FieldN | L_BYTE | Резерв |
CharSetN | L_WORD | Номер кодовой страницы |
Field № 1 | Тип 1-го поля в записи буфера выборки данных | Значение 1-го поля в записи буфера выборки данных |
Field № 2 | Тип 2-го поля в записи буфера выборки данных | Значение 2-го поля в записи буфера выборки данных |
... | ... | ... |
Field № N | Тип N-го поля в записи буфера выборки данных | Значение N-го поля в записи буфера выборки данных |
Первый элемент буфера выборки данных содержит число полей буфера
выборки данных (Number_Of_Field
). Далее следуют описатели полей буфера выборки данных, в каждом из
которых
элемент
Type_Field
указывает тип данных поля, а элемент
Len_FieldN
– длину соответствующего поля.
Вслед за описателями полей размещаются значения полей в том виде, в каком
они представлены в БД.
Тип данных полей выборки данных (значение полей Type_Field1,…
Type_FieldN)
указывается с помощью байтовых типов данных интерфейса нижнего уровня
(см. приложение
4, inter.h).
Для получения записи выборки данных в специфицированном формате
нужно присвоить флагу выполнения запроса (PrzExe
)
контрольного блока значение M_SPEC.
Специфицированную запись можно разобрать по отдельным полям последовательно или выборочно.
В приложении 5 приведен пример работы со специфицированным форматом.