четверг, 16 декабря 2010 г.

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

Третья часть перевода документации, описывающей методы подстановки ODI (часть 1, часть 2).


Генерация команды SELECT для источников.

Модули знаний LKM и IKM типов работают с результатами выборки данных из таблиц источников. Для загрузочного модуля знаний (LKM) результат выборки это некая команда, соединяющая несколько таблиц источников, правила этого соединения, фильтры, который должен быть выполнен на системе источнике данных. Для интеграционного модуля знаний (IKM) результирующий набор строк это то, что получается путем преобразования данных таблиц источников, но уже в области стейджа.

Для построения этих выборок данных чаще всего вы будете использовать оператор SELECT в своих модулях знаний. В ODI присутствуют определенные, более интеллектуальные, методы подстановок, включая метод getColList, которые помогают в генерации подходящего SQL кода.
Все описанные ниже методы работают в LKM и IKM модулях знаний.

Метод Описание
getFrom() Возвращает содержимое оператора FROM для SELECT-а, включающее соответствующие таблицы источники; правые, левые и полные джоины. Этот метод использует информацию из топологии, чтобы определить какие особенности технологии поддерживает источник или приемник данных. Оператор FROM строится с использованием ключевых слов LEFT, INNER и т.п., а также с использованием скобок, если они поддерживаются технологией.
  • Когда используется в модуле знаний загрузки (LKM) возвращает FROM который должен будет выполняться на сервере источнике.
  • Когда используется в модуле знаний интеграции (IKM) возвращает FROM который должен будет выполняться на сервере для области стейджа.
getFilter() Возвращает строку с фильтрами, разделенными оператором AND.
  • Когда используется в LKM, возвращает строка фильтров, для выполнения на сервере источнике.
  • Когда используется в IKM, возвращает строка фильтров, для выполнения на сервере стейджа.
getJrnFilter() Возвращает строку специального фильтра журналирования для таблиц, у которых задан контроль изменения данных (CDC).
getGrpBy() Возвращает значение оператора GROUP BY, если в маппинге интерфейса обнаруживается агрегирующая функция. В GROUP BY добавляются все колонки целевой таблицы, в маппинге которых не обнаружено ни одной агрегирующей функции. Список наименований агрегирующих функций определяется языком, который задается для технологии в топологии.
getHaving() Возвращает значение оператора HAVING если в одном из фильтров обнаружены агрегирующие функции. В строку для оператора HAVING добавляются все фильтры с агрегацией. Список функций агрегации определяется в топологии.

Чтобы получить выборку данных из любой реляционной СУБД, необходимо использовать следующее выражение в загрузочном модуле знаний:

select <%=odiRef.getPop("DISTINCT_ROWS")%>
<%=odiRef.getColList("", "[EXPRESSION]\t[ALIAS_SEP] [CX_COL_NAME]", ",\n\t", "", "")%>
from <%=odiRef.getFrom()%>
where (1=1)
<%=odiRef.getFilter()%>
<%=odiRef.getJrnFilter()%>
<%=odiRef.getJoin()%>
<%=odiRef.getGrpBy()%>
<%=odiRef.getHaving()%>


Для получения SQL выражения в интеграционном модуле знаний, которое соберет данные таблиц источников в области стейджа для получения финального набора данных, необходимо использовать следующий код в IKM. Обратите внимание на то, что getColList отфильтровывает те колонки, которые заполняются на сервере приемнике данных, и не включает колонки "только для чтения".

select <%=odiRef.getPop("DISTINCT_ROWS")%>
<%=odiRef.getColList("", "[EXPRESSION]", ",\n\t", "", "(not TRG) and REW")%>
from <%=odiRef.getFrom()%>
where (1=1)
<%=odiRef.getJoin()%>
<%=odiRef.getFilter()%>
<%=odiRef.getJrnFilter()%>
<%=odiRef.getGrpBy()%>
<%=odiRef.getHaving()%>


Так как строки с фильтрами и джоинами начинаются с ключевого слова AND, то оператор WHERE для SELECT-а начинается с условия 1 = 1, которое всегда истинно.

Получение дополнительной информации.

МетодОписаниеГде
getPop() Возвращает информацию по текущему интерфейсу. LKM, IKM
getInfo() Возвращает информацию о сервере источнике или приемнике данных. Процедура или KM
getSession() Возвращает информацию о текущей выполняющейся сессии. Процедура или KM
getOption() Возвращает значение опции по ее имени. Процедура или KM
getFlexFieldValue() Возвращает значение настраиваемого поля. Для итераторных методов подстановки, это значение может быть использовано как часть паттерна. Процедура или KM
getJrnInfo() Возвращает информацию о CDC настройках. JKM, LKM, IKM
getTargetTable() Возвращает информацию о целевой таблице интерфейса. LKM, IKM, CKM
getModel() Возвращает информацию о текущей модели в процессе реверса. RKM

Дополнительные техники генерации кода.

Вы можете использовать условное выполнение и программирование для генерации кода. ODI может интерпретировать JAVA код, который заключен между "<%" и "%>". Полное описание языка программирования JAVA доступно на http://java.sun.com.
Следующая таблица дает представление об условном выполнении и вызове JAVA подпрограмм:

Код в KM или процедуреСгенерированный код

<%
String myTableName;
myTableName = "ABCDEF";

%>
drop table
<%=odiRef.getObjectName(myTableName.toLowerCase())%>
drop table SCOTT.abcdef

<%
String myOptionValue=odiRef.getOption("Test");
if (myOption.equals("TRUE"))
{
out.print("/* Опция Test установлена в Да */");
}
else
{
%>
/* Опция Test не установлена */
<%
}
%>
...
Значение опции Test - Yes:
/* Опция Test установлена в Да */
...
Иначе:
/* Опция Test не установлена */
...

Create table <%=odiRef.getObjectName("XYZ")%>
(
<%
String s;
s = "ABCDEF";
for (int i=0; i < s.length(); i++) {

%>
<%=s.charAt(i)%> char(1),
<%
}
%>
G char(1)
)

Create table ADAMS.XYZ
(
A char(1),
B char(1),
C char(1),
D char(1),
E char(1),
F char(1),
G char(1)
)

Файл источник - Knowledge Modules Developer's Guide


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

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