пятница, 3 декабря 2010 г.

Методы подстановки ODI (Substitution Methods). Часть 2.

Продолжаю перевод документации, посвященный описанию методов подстановки (Substitution Methods API) в Oracle Data Integrator. Начало тут.


Работа со списками таблиц, колонок и выражений.
Генерация кода из списка элементов предполагает некий вид цикла. ODI решает эту задачу через методы работы со списками. Эти методы работают как итераторы, в которые передаются фактические параметры, шаблоны результата, разделители. Далее эти методы возвращают строку с нужными разделителями.
Методы-итераторы принимают, как минимум, четыре возможных параметра:

  • Start: подстрока, с которой начнется результирующая строка.
  • Pattern: шаблон подстановки, с атрибутами, которые будут привязаны к списку значений в результирующей строке.
  • Separator: строка разделитель, которая будет отделять текущий элемент списка от следующего.
  • End: подстрока, которая будет завершать результирующую строку.

Некоторые из методов принимают дополнительный параметр отбора (Selector), который работает как фильтр, и позволяет отбирать только часть элементов списка.

Некоторые из методов приведены в таблице ниже:

Метод Описание Где
getColList() Наиболее часто используемый метод в ODI. Возвращает список колонок и выражений, которые должны выполниться в нужном контексте. Его можно использовать для генерации таких, например, списков:
  • Колонки при создании таблицы.
  • Колонки для обновления таблицы.
  • Выражения для выборки данных в модулях знаний LKM, IKM или CKM.
  • Описание колонок для скрипта загрузки.
Это метод принимает Selector как 5й параметр для дополнительной фильтрации списка колонок.
LKM, CKM, IKM, JKM, SKM
getTargetColList() Возвращает список колонок целевой таблицы. Так же принимает 5й параметр для дополнительной фильтрации. LKM, CKM, IKM, JKM,SKM
getAKColList() Возвращает список колонок, определенных как альтернативные ключи. CKM, SKM
getPKColList() Возвращает список колонок первичных ключей. Вместо него может быть использован метод getColList с указанием Selector"PK". CKM,SKM
getFKColList() Возвращает список ссылающихся и тех, которые ссылаются, колонок для текущего ключа. CKM,SKM
getSrcTablesList() Возвращает список таблиц источников интерфейса. Вместо вызова этого метода желательно где только возможно использовать метод getFrom. LKM, IKM
getFilterList() Возвращает список фильтров интерфейса. Обычно метод getFilter бывает более подходящим. LKM, IKM
getGrpByList() Возвращает список выражений, который должен появиться в операторе GROUP BY, если в мапинге интерфейса обнаруживается хотя бы одна агрегатная функция. Более подходящий метод - getGrpBy. LKM, IKM
getHavingList() Возвращает список выражений, который должен появиться в операторе HAVING, если в фильтрах интерфейса обнаруживается хотя бы одна агрегатная функция. Более подходящий метод - getHaving. LKM, IKM
getSubscriberList() Возвращает список подписчиков. JKM

Следующий пример показывает использование метода getTargetColList для генерации скрипта создания таблицы.

Код в шаге модуля знаний:

Create table MYTABLE
<%=odiRef.getTargetColList("(\n", "\t[COL_NAME] [DEST_WRI_DT]", ",\n",
"\n)")%>


Сгенерированный код:

Create table MYTABLE
(
CUST_ID numeric(10),
CUST_NAME varchar(250),
ADDRESS varchar(250),
CITY varchar(50),
ZIP_CODE varchar(12),
COUNTRY_ID varchar(3)
)


В этом примере:
  • Start установлен в "(\n". Сгенерированный код будет начинаться с открывающейся скобки, за которой будет перевод строки (\n).
  • Pattern установлен в "\t[COL_NAME] [DEST_WRI_DT]". Метод циклически пройдет все колонки целевой таблицы, и соберет строку из знака табуляции (\t), затем имени колонки ([COL_NAME]), затем пробела и типа колонки для целевой БД ([DEST_WRI_DT]).
  • Separator установлен в ",\n". Каждый сгенерированный Pattern будет отделен от следующего паттерна запятой (,) и символом перевода каретки (\n).
  • End установлен в "\n)". Сгенерированная методом строка будет завершена символом перевода каретки (\n) и закрывающей скобкой ()).

Использование getColList для генерации запроса добавления данных (INSERT)

Код в шаге модуля знаний:

insert into MYTABLE
(
<%=odiRef.getColList("", "[COL_NAME]", ", ", "\n", "INS AND NOT TARG")%>
<%=odiRef.getColList(",", "[COL_NAME]", ", ", "", "INS AND TARG")%>
)
Values
(
<%=odiRef.getColList("", ":[COL_NAME]", ", ", "\n", "INS AND NOT TARG")%>
<%=odiRef.getColList(", ", "[EXPRESSION]", ", ", "", "INS AND TARG")%>
)


Сгенерированный код:

insert into MYTABLE
(
CUST_ID, CUST_NAME, ADDRESS, CITY, COUNTRY_ID, ZIP_CODE, LAST_UPDATE
)
Values
(
:CUST_ID, :CUST_NAME, :ADDRESS, :CITY, :COUNTRY_ID, 'ZZ2345', current_timestamp
)


В этом примере, значения, которые должны быть вставлены в MYTABLE, это либо переменные, с тем же именем, что и целевые колонки, или некие константные значения, которые вычисляются в той же области, что и целевая таблица. Чтобы получить эти два разных набора значений, метод фильтруется с помощью Selector параметра:
  • "INS AND NOT TARG". Первое - генерация списка имен колонок, разделенных запятыми ([COL_NAME]), и список для значений колонок в разделе Values, который суть те же имена колонок, с двоеточием в начале (:[COL_NAME]). Фильтруем список и выбираем только те, которые помечены как добавляемые при вставке, и, при этом, не выполняются в целевой области.
  • "INS AND TARG". Затем генерируем список колонок ([COL_NAME]), с соответствующими выражениями ([EXPRESSION]), которые выполняются в той же области, что и целевая таблица, и так же помечены как добавляемые. Список должен начаться с запятой, если в нем будет хотя бы одно значение.

Использование getSrcTableList

Код в шаге модуля знаний:

insert into MYLOGTABLE
(
INTERFACE_NAME,
DATE_LOADED,
SOURCE_TABLES
)
values
(
'<%=odiRef.getPop("POP_NAME")%>', current_date,
'' <%=odiRef.getSrcTablesList("|| ", "'[RES_NAME]'", " || ',' || ", "")%>
)


Сгенерированный код:

insert into MYLOGTABLE
(
INTERFACE_NAME,
DATE_LOADED,
SOURCE_TABLES
)
values
(
'Int. CUSTOMER',
current_date,
'' || 'SRC_CUST' || ',' || 'AGE_RANGE_FILE' || ',' || 'C$0_CUSTOMER'
)

В этом примере getSrcTablesList используется для генерации списка источников, которые используются в интерфейсе, и последующем его добавлении при помощи команды INSERT, в таблицу MYLOGTABLE. В качестве разделителя используется конструкция из оператора конкатенации, запятой, и последующего оператора конкатенации (" || ',' || ").
В случае если список таблиц источников пуст - вставится пустая строка как значение колонки SOURCE_TABLES.

Хотел написать о том, что в последнем абзаце есть одна неточность. Насколько я помнил, создать интерфейс без источников можно, но, при сохранении этого интерфейса, выдается ошибка. Так же невозможно было выполнить такой интерфейс, а ведь именно при выполнении интерфейса выполнился бы код, который задается в модуле знаний.
После проверки оказалось, что, по крайней мере в версии 10.1.3.5, ODI позволяет создавать интерфейсы с заданием только целевой таблицы. Это очень хорошо, так как позволяет выгружать данные из таблицы, например, в файл, с использованием не процедур, а интерфейсов, разработав для такой выгрузки соответствующий модуль знаний.


Окончание следует...

Комментариев нет:

Отправить комментарий