DBJOIN

DBJOIN получает данные через один входной порт и объединяет их с данными из таблицы базы данных. Эти два источника данных могут иметь разную структуру метаданных.

Не требует сортировки входных данных и работает очень быстро, поскольку данные обрабатываются в памяти.

После объединения данные отправляются на первый выходной порт. Второй выходной порт может использоваться для вывода несовпадающих по ключу записей из основного потока.

Поток передающий данные через первый входной порт, называются основным, а поток данных из базы называется подчинённым. Его данные считаются поступившими через виртуальный входной порт. Каждая основная запись сопоставляется с подчинённой записью по одному или нескольким полям, называемым ключом соединения.

Выходные данные создаются путем применения преобразования, которое сопоставляет объединенные входные данные с выходными.

Порты DBJOIN:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даГлавный входной портЛюбые
1 (виртуальный)даПодчинённый входной порт
Output0даВыходной порт для объединенных данных
1нетВыходной порт для необъединённых данныхКак на Input 0

Атрибуты DBJOIN:

АтрибутОбязательныйОписаниеВозможные значения
joinKeyдаКлюч, по которому объединяются входящие потоки данных. Если полей ключа несколько - они должны быть записаны через точку с запятой. Перед именем поля должен стоять знак доллара `$`.

$schemaName;$tableName

joinTypeнетТип объединения. Бывает "inner"(по умолчанию) и "leftOuter"joinType="leftOuter"
dbConnectionдаИдентификатор соединения с БД, который будет использоваться в качестве ресурса подчинённых записей.conn0
sqlQueryдаSQL-запрос. В условии WHERE нужно использовать плейсхолдер '?' для подстановки значения ключа (если ключ составной, используйте плейсхолдер для каждого поля в WHERE).

        select c.ordinal_position
        from information_schema.tables t
            join information_schema.columns c on c.table_name=t.table_name
                                              and c.table_schema=t.table_schema
        where lower(t.table_schema)=lower(?)
            and lower(t.table_name)=lower(?)
            and lower(c.column_name)=lower(?)

urlдаИмя внешнего файла, включая путь, содержащий SQL-запрос.

url="${QUERY_DIR}"

transformдаФункция преобразования
function transform() {
    $out[0].customer_id = $in[0].person_number;
    $out[1].customer = $in[0].person_name;
return ALL;
}

cacheSizeМаксимальное количество записей с разными значениями ключей, которые можно сохранить в памяти.

cacheSize="100" по умолчанию

charsetКодировка файла, в котором хранится алгоритм преобразования.

charset="UTF-8" по умолчанию

Ключ соединения

Ключ соединения — это последовательность имен полей из основного источника данных, отделенных друг от друга точкой с запятой. Ключ можно определить в редакторе шага. Порядок имен полей должен соответствовать порядку ключевых полей таблицы базы данных (и их типам данных). Подчинённая часть ключа соединения должна быть определена в атрибуте sqlQuery.

$first_name;$last_name

Это поля, которые служат для объединения основных записей с подчинёнными записями. SQL-запрос должен содержать выражение, которое может выглядеть следующим образом:

... where fname=? and lname=?

Значение first_name будет подставлено на место первого знака вопроса в этом условии, а last_name - на место второго. Сначала будет произведён поиск совпадений по joinKey в кеш-памяти, если подходящих записей не обнаружится, то данные будут запрошены из базы данных, иначе - найденная запись сразу отправится для преобразования в функцию transform.

Преобразование

Преобразование в DBJOIN позволяет определить способ сопоставления данных, с помощью которого записи буду отправлены на первый выходной порт. Несоединенные записи из основного потока, отправляемые на второй выходной порт, не могут быть изменены в рамках преобразования DBJOIN.

Заметка: Если преобразование указано во внешнем файле, рекомендуется явно указать кодировку файла в артибуте charset.

Заметка:

  • при получении более одной записи из базы в лог будет выведено предупреждение "read more than one record".
  • при автоматическом увеличении рамера кеша для обработки данных - "riched cache size".

Пример. Соединение записей из двух источников.

  1. Объединим записи из двух баз. Используем DB_READER для чтения из базы postgres и DBJOIN для чтения из firebird и объединения потоков по ключу.

Запрос для DB_READER:

sqlQuery = "select bigintcolumn, booleancolumn, charcolumn, smallintcolumn, textcolumn from onebridge."million_row" order by bigintcolumn limit 100"

Атрибуты для DBJOIN:

sqlQuery = "select FIRST 100 bigintcolumn, booleancolumn, charcolumn, smallintcolumn, textcolumn from MILLION_ROW WHERE bigintcolumn = ?"

Объединённые данные можно вывести на первый выходной порт DBJOIN, а не обьединенные данные с главного входного порта - на второй порт.