Хорошо, у меня есть сложная проблема рекурсии. Я хочу получить последовательность установки dependecy всех моих объектов (all_objects table) в моей базе данных Oracle 11g.Получить последовательность установки объектов Oracle
Сначала я создал представление, проведение всех зависимостей
create or replace
view REALLY_ALL_DEPENDENCIES as
select *
from ALL_DEPENDENCIES
union
select owner, index_name, 'INDEX', table_owner, table_name, table_type, null, null
from all_indexes
union
select p.owner, p.table_name, 'TABLE', f.owner, f.table_name, 'TABLE', null, null
from all_constraints p
join all_constraints f
on F.R_CONSTRAINT_NAME = P.CONSTRAINT_NAME
and F.CONSTRAINT_TYPE = 'R'
and p.constraint_type='P'
;
/
EDIT
Я пытался сделать concate все зависимости с помощью этой функции:
create
or replace
function dependency(
i_name varchar2
,i_type varchar2
,i_owner varchar2
,i_level number := 0
,i_token clob := ' ') return clob
is
l_token clob := i_token;
l_exist number := 0;
begin
select count(*) into l_exist
from all_objects
where object_name = i_name
and object_type = i_type
and owner = i_owner;
if l_exist > 0 then
l_token := l_token || ';' || i_level || ';' ||
i_name || ':' || i_type || ':' || i_owner;
else
-- if not exist function recursion is finished
return l_token;
end if;
for tupl in (
select distinct
referenced_name
,referenced_type
,referenced_owner
from REALLY_ALL_DEPENDENCIES
where name = i_name
and type = i_type
and owner = i_owner
)
loop
-- if cyclic dependency stop and shout!
if i_token like '%' || tupl.referenced_name || ':' || tupl.referenced_type || ':' || tupl.referenced_owner || '%' then
select count(*) into l_exist
from REALLY_ALL_DEPENDENCIES
where name = tupl.referenced_name
and type = tupl.referenced_type
and owner = tupl.referenced_owner;
if l_exist > 0 then
return '!!!CYCLIC!!! (' || i_level || ';' || tupl.referenced_name || ':' || tupl.referenced_type || ':' || tupl.referenced_owner || '):' || l_token;
end if;
end if;
-- go into recursion
l_token := dependency(
tupl.referenced_name
,tupl.referenced_type
,i_owner /* I just want my own sources */
,i_level +1
,l_token);
end loop;
-- no cyclic condition and loop is finished
return l_token;
end;
/
И я могу запросить до
select
object_name
,object_type
,owner
,to_char(dependency(object_name, object_type, owner)) as dependecy
from all_objects
where owner = 'SYSTEM'
;
Хорошо, может быть, это что-то вроде «обмана», но вы не можете делать циклические зависимости во время создания. Так что, по крайней мере, как человек, я могу только создать один объект за другим :-) И эта последовательность должна быть «обратная инженерия».
Теперь меня больше интересует решение, чем раньше ;-) И это все еще касается сложной части ... «Как я могу выбрать все источники из схемы orderd своей последовательностью установки (список зависимых объектов перед использованием объект) "? Это просто какая-то проблема сортировки, не так ли?
Поскольку вы можете иметь циклических зависимостей, может оказаться невозможным. –
Да, но, как вы можете видеть, я могу их обнаружить. Итак, затем добавьте contraint -> сортировать все источники по зависимостям и сортировать циклические источники до конца в наборе результатов. Теперь можно получить решение ;-) Хорошо, мибе, ты не хочешь это делать, потому что это не имеет для тебя смысла, но мне все же имеет смысл :-) – christian