Работа со списками таблиц, колонок и выражений.
Генерация кода из списка элементов предполагает некий вид цикла. ODI решает эту задачу через методы работы со списками. Эти методы работают как итераторы, в которые передаются фактические параметры, шаблоны результата, разделители. Далее эти методы возвращают строку с нужными разделителями.
Методы-итераторы принимают, как минимум, четыре возможных параметра:
- Start: подстрока, с которой начнется результирующая строка.
- Pattern: шаблон подстановки, с атрибутами, которые будут привязаны к списку значений в результирующей строке.
- Separator: строка разделитель, которая будет отделять текущий элемент списка от следующего.
- End: подстрока, которая будет завершать результирующую строку.
Некоторые из методов принимают дополнительный параметр отбора (Selector), который работает как фильтр, и позволяет отбирать только часть элементов списка.
Некоторые из методов приведены в таблице ниже:
Метод | Описание | Где |
---|---|---|
getColList() | Наиболее часто используемый метод в ODI. Возвращает список колонок и выражений, которые должны выполниться в нужном контексте. Его можно использовать для генерации таких, например, списков:
| 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'
)
В случае если список таблиц источников пуст - вставится пустая строка как значение колонки SOURCE_TABLES.
Хотел написать о том, что в последнем абзаце есть одна неточность. Насколько я помнил, создать интерфейс без источников можно, но, при сохранении этого интерфейса, выдается ошибка. Так же невозможно было выполнить такой интерфейс, а ведь именно при выполнении интерфейса выполнился бы код, который задается в модуле знаний.
После проверки оказалось, что, по крайней мере в версии 10.1.3.5, ODI позволяет создавать интерфейсы с заданием только целевой таблицы. Это очень хорошо, так как позволяет выгружать данные из таблицы, например, в файл, с использованием не процедур, а интерфейсов, разработав для такой выгрузки соответствующий модуль знаний.
Окончание следует...
Комментариев нет:
Отправить комментарий
Примечание. Отправлять комментарии могут только участники этого блога.