Доступные версии документации

Работа с пакетом данных BSON-формата

BSON (Binary JS Object Notation) – двоичное представление текстового формата документов JSON-формата (JavaScript Object Notation – текстовый формат обмена данными, основанный на JavaScript), хранящее данные в виде пар «ключ/значение» как единый объект.

BSON-формат данных применяется для обмена данными с различными приложениями и получения данных из различных источников данных. Данные BSON-пакета обрабатывается как курсор без описателя полей.

Исходный BSON-пакет данных формирует клиентское приложение или получает его готовым из внешнего источника данных (максимальный размер пакета составляет 4000 байт) и передает для дальнейшей обработки СУБД ЛИНТЕР с помощью вызова хранимой процедуры. Хранимая процедура с помощью специальных средств процедурного языка для обработки данных BSON-пакета извлекает из пакета необходимую информацию и выполняет её дальнейшую обработку на стороне ЛИНТЕР-сервера (размещает в БД или в файле, возвращает клиентскому приложению полученный из внешнего источника и преобразованный BSON-пакет и т.п.).

Пример передачи на обработку процедуре pp1 BSON-пакета b1:

create or replace procedure pp2( ) result varchar(1024)
declare
  var b1 varbyte(4000);
  var res varchar(1024);
code
   b1 := hextoraw(
"520000000300440000001069002B02000009647400E0325E7618000000027374720017
000000D092D181D0B5D0BC20D0BFD180D0B8D0B2D0B5D18221000530000204000000050
60708000300050000000000" );
   call pp1( b1 ) into res;
   return res;
end;

Для извлечения информации из документов BSON-пакета хранимая процедура должна обладать полной информацией об именах и/или типах данных полей документов. Доступ к полям документа возможен как по имени (если поле именованное), так и по их позиционному местоположению (для именованных и не именованных полей).

Схема обработки данных BSON-пакета

Пусть пакет данных BSON имеет следующую структуру:

    BSON-пакет
'doc1'  (int) 'I' (string) 'S'
'doc2'  (string) 'S'  (doc) 'doc21' (doc) 'doc22'

'docN'  (int) 'I'

Для доступа ко всем документам пакета:

  1. открыть доступ к пакету BSON:

    OPEN <cursor_bson> FOR BSON <пакет данных>;
  2. с помощью оператора FETCH переместиться (позиционироваться) на нужный документ пакета (путем последовательного перемещения по документам или прямым переходом к нужному документу), например, на документ с именем 'doc2':

    FETCH <cursor_bson> 'doc2';

    В результате <cursor_bson> будет позиционирован на нужном документе пакета.

  3. для перемещения по полям выбранного вложенного документа 'doc2' создать соответствующий курсор для позиционированного на предыдущем шаге документа:

    OPEN <cursor_doc2> FOR <cursor_bson>;

  4. с помощью оператора FETCH переместиться (позиционироваться) на нужное поле документа (путем последовательного перемещения по полям документ или прямым переходом к нужному полю), например:

    • на вложенный документ с именем 'doc21':

      FETCH <cursor_doc2> 'doc21';

      В результате <cursor_doc2> будет позиционирован на нужном поле 'doc21';

    • или c помощью функции extract<тип> извлечь значение поля известного типа данных (с помощью функции extractvalue – текстовое значение поля с любым типом данных), например, значение поля 'S':

      extractstring(<cursor_doc2>, 'S');

  5. т.к. поле 'doc21' является вложенным документом, то для доступа к его полям создать соответствующий курсор для позиционированного на предыдущем шаге поля:

    OPEN <cursor_doc21> FOR <cursor_doc2>;

  6. с помощью оператора FETCH перемещаться по полям документа с именем 'doc21':

    FETCH <cursor_doc2> 'doc21';

    и c помощью функции extract<тип> или extractvalue извлекать значения нужных полей документа.

Заметили ошибку?
Выделите текст и нажмите Ctrl + Enter