Sie wollen so etwas:
select t.table_name, level,lpad(' ', 2 * (level - 1))||t.table_name
from user_tables t
join user_constraints c1
on (t.table_name = c1.table_name
and c1.constraint_type in ('U', 'P'))
left join user_constraints c2
on (t.table_name = c2.table_name
and c2.constraint_type='R')
start with t.table_name = 'ROOT_TAB'
connect by prior c1.constraint_name = c2.r_constraint_name
Das Problem mit der ursprünglichen Abfrage besteht darin, dass uc.constraint_name für die untergeordnete Tabelle der Name des Fremdschlüssels ist. Das ist in Ordnung, um das erste Kind mit der Stammtabelle zu verbinden, aber es ist nicht das, was Sie brauchen, um die Kinder auf der zweiten Ebene mit der ersten zu verbinden. Aus diesem Grund müssen Sie zweimal gegen die Einschränkungen antreten – einmal, um den Primärschlüssel der Tabelle zu erhalten, einmal, um die Fremdschlüssel zu erhalten.
Abgesehen davon, wenn Sie die all_*-Ansichten und nicht die user_*-Ansichten abfragen, möchten Sie sie im Allgemeinen auf table_name UND Eigentümer verbinden, nicht nur auf table_name. Wenn mehrere Schemas Tabellen mit demselben Namen haben, führt die Verknüpfung nur mit Tabellenname zu falschen Ergebnissen.