Quieres algo como esto:
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
El problema con la consulta original es que uc.constraint_name para la tabla secundaria es el nombre de la clave externa. Eso está bien para conectar el primer elemento secundario a la tabla raíz, pero no es lo que necesita para conectar los elementos secundarios del segundo nivel al primero. Es por eso que debe unirse contra las restricciones dos veces:una para obtener la clave principal de la tabla y otra para obtener las claves externas.
Aparte, si va a consultar las vistas all_* en lugar de las vistas user_*, generalmente desea unirlas en nombre_tabla Y propietario, no solo nombre_tabla. Si varios esquemas tienen tablas con el mismo nombre, unir solo table_name dará resultados incorrectos.