Приведу пример реального использования Metadata Injection.
Задача:
Есть набор XML-файлов разной структуры, представляющих собой выгрузку наполнения БД из некой внешней системы. Каждый XML-файл соответствует одной сущности БД. Каждой XML соответствует своя XSD.
Необходимо загрузить эти XML в БД.
1 Шаг.
На основании XSD нужно сгенерить структуру в БД для загрузки в нее данных из XML.
С помощью простой трансформации парсим информацию из XSD:

Информация сохраняется в таблицу БД:

Затем генерится DDL для создания таблиц. Пример скриптов генерации здесь
2 Шаг.
Загрузка данных.
Ниже представлена основная джоба запуска загрузки.
Сначала, файлы разархивируются, удаляется список некорректных символов, включается логирование и т.п.. Нас интересует запуск трансформации Run inj

Эта трансформация выглядит следующим образом:

Get List of B$-tables из таблицы заполненной из XSD получаем следующую информацию:
путь к файлам, имя файлов, имя таблиц для загрузки, loop_xpath для xml Get data from XML

Get list of XML-file получает реальные путь и наименование XMLфайлов, на выходе поле filename
В трансформацию Get list of columns B$-table передаем список параметров:

Вызываемая трансформация имеет вид:

List of columns B$-table получает следующую информацию:
наименование поля из XML, соответствующие ему поля БД, тип данных, маска форматирования.

Get Variables from prev step переопределяет переменные с предыдущего шага.

Полученные значения полей и переменные передаем в шаг ETL Metadata Injection: start parse XML на вкладку Inject Metadata



Трансформация в ETL Metadata Injection: start parse XML имеет следующую структуру:

Парсится XML и информация вставляется в БД.
В этой самой финальной трансформации необходимо отметить две тонкости:
а) Metadata Injection поддерживает не все опции и значения шага Get data from XML.
Поэтому filename, loop xpath и prune path to handle large files необходимо определять через переменные с предыдущего шага.


Плюс, для файлов размером более 300 Мб обязательно нужно заполнять prune path to handle large files. Это позволит читать большие файлы в параллель. Подробности здесь.
б) В XML встречаются длинные текстовые значения, и для одного поля БД VARCHAR2(200 CHAR) текст полученный из XML превышал размерность. И обрезать это поле не получилось, ввиду того что Metadata Injection поддерживает не все виды шагов. Поэтому пришлось сменить тип поля на CLOB.
Ссылка на код здесь.
Задача:
Есть набор XML-файлов разной структуры, представляющих собой выгрузку наполнения БД из некой внешней системы. Каждый XML-файл соответствует одной сущности БД. Каждой XML соответствует своя XSD.
Необходимо загрузить эти XML в БД.
1 Шаг.
На основании XSD нужно сгенерить структуру в БД для загрузки в нее данных из XML.
С помощью простой трансформации парсим информацию из XSD:

Информация сохраняется в таблицу БД:

Затем генерится DDL для создания таблиц. Пример скриптов генерации здесь
2 Шаг.
Загрузка данных.
Ниже представлена основная джоба запуска загрузки.
Сначала, файлы разархивируются, удаляется список некорректных символов, включается логирование и т.п.. Нас интересует запуск трансформации Run inj

Эта трансформация выглядит следующим образом:

Get List of B$-tables из таблицы заполненной из XSD получаем следующую информацию:
путь к файлам, имя файлов, имя таблиц для загрузки, loop_xpath для xml Get data from XML

Get list of XML-file получает реальные путь и наименование XMLфайлов, на выходе поле filename
В трансформацию Get list of columns B$-table передаем список параметров:

Вызываемая трансформация имеет вид:

List of columns B$-table получает следующую информацию:
наименование поля из XML, соответствующие ему поля БД, тип данных, маска форматирования.

Get Variables from prev step переопределяет переменные с предыдущего шага.

Полученные значения полей и переменные передаем в шаг ETL Metadata Injection: start parse XML на вкладку Inject Metadata



Трансформация в ETL Metadata Injection: start parse XML имеет следующую структуру:

Парсится XML и информация вставляется в БД.
В этой самой финальной трансформации необходимо отметить две тонкости:
а) Metadata Injection поддерживает не все опции и значения шага Get data from XML.
Поэтому filename, loop xpath и prune path to handle large files необходимо определять через переменные с предыдущего шага.


Плюс, для файлов размером более 300 Мб обязательно нужно заполнять prune path to handle large files. Это позволит читать большие файлы в параллель. Подробности здесь.
б) В XML встречаются длинные текстовые значения, и для одного поля БД VARCHAR2(200 CHAR) текст полученный из XML превышал размерность. И обрезать это поле не получилось, ввиду того что Metadata Injection поддерживает не все виды шагов. Поэтому пришлось сменить тип поля на CLOB.
Ссылка на код здесь.