понедельник, 8 июля 2013 г.

Выбрать все джоины и фильтры для интерфейса 11g.

Приветствую.

Когда-то давно я написал скрипт, который должен был помочь найти в репозитории Oracle Data Intergator-а все тексты для соединений таблиц источников в интерфейсе. Этот скрипт мне пригодился не раз, но всегда речь шла о работе со структурой репозитория 10й версии. В ODI 11g структура несколько изменилась, в частности, добавилась возмножность работы с множествами, поэтому мой старый скрипт никаких результатов не возвращал.

Скажу даже больше, новая структура репозитория совсем не содержит информации в двух самых примечательных (ранее) таблицах: SNP_TXT и SNP_EXP_TXT. Они теперь пусты, по крайней мере, на моем текущем проекте в них нет ни одной записи.


Тем не менее, потратив пару вечеров, я смог разобраться в изменениях и для пары примеров новый скрипт выдал корректный результат. Итак, чтобы получить все джоины и фильтры для некоторого интерфейса выполните следующий скрипт в репозитории ODI 11g:

select itf.pop_name as "Interface", m.mod_name as "Model", t1.table_name as "Table_1", t2.table_name as "Table_2",
case when clause.join_type = 'C' then 'cross join'
else case when clause.clause_type = 3 then 'filter'
else case when clause.ind_outer1 = 0 and clause.ind_outer2 = 0 then 'inner join'
when clause.ind_outer1 = 0 and clause.ind_outer2 = 1 then 'right outer join'
when clause.ind_outer1 = 1 and clause.ind_outer2 = 0 then 'left outer join'
when clause.ind_outer1 = 1 and clause.ind_outer2 = 1 then 'full join' end end end as JOIN_TYPE,
coalesce(t1.SRC_TAB_ALIAS, '') as "Alias_1", coalesce(t2.SRC_TAB_ALIAS, '') as "Alias_2",
th.full_text as "Join condition"
from SNP_POP_CLAUSE clause
left outer join SNP_DATA_SET ds
on ds.I_DATA_SET = clause.I_DATA_SET
left outer join SNP_POP itf
on itf.i_pop = ds.i_pop
left outer join SNP_SOURCE_TAB t1
on t1.I_SOURCE_TAB = clause.I_TABLE1 and t1.I_DATA_SET = ds.I_DATA_SET
left outer join SNP_SOURCE_TAB t2
on t2.I_SOURCE_TAB = clause.I_TABLE2 and t2.I_DATA_SET = ds.I_DATA_SET
left outer join SNP_TABLE st1
on t1.I_TABLE = st1.I_TABLE
left outer join SNP_TABLE st2
on t2.I_TABLE = st2.I_TABLE
left outer join SNP_MODEL m
on st1.I_MOD = m.I_MOD
left outer join SNP_TXT_HEADER th on th.i_txt = I_TXT_SQL
where 1 = 1
--and itf.pop_name = 'Interface name'
order by m.mod_name, t1.table_name;


Раскоментируйте условие выборки, добавив нужное вам наименование интерфейса, чтобы получить текст используемый для фильтрации или соединения нескольких таблиц источников.

2 комментария:

  1. Подскажите, для чего делается coalesce(t1.SRC_TAB_ALIAS, '') ?

    Как мне думается, в данном случае, если значение поля SRC_TAB_ALIAS равно NULL, типизация данного поля будет браться из описания таблицы.

    ОтветитьУдалить
    Ответы
    1. Думаю, ответ тут прост.

      Я просто не люблю NULL-ы, вот и леплю везде коалески. Думаю, можно обойтись и без него.

      Насчет типизации из описания - не вполне уверен. По крайней мере, в случае использования в конструкции CASE WHEN ... ELSE END - coalesce бывает необходим.

      Удалить