Recursively walktrough Oracle's constraints
WITH
objectscte AS
(SELECT
ao.owner,
ao.object_name,
ao.object_type
FROM
all_objects
ao
WHERE
ao.owner = '&owner'
AND
NOT
ao.object_name LIKE
'BIN$%'
AND
NOT
ao.object_name LIKE
'DMRS_%'
AND
NOT
ao.object_name LIKE
'DMRV_%'
AND
NOT
ao.object_name LIKE
'DT_%'
AND
NOT
ao.object_name LIKE
'CG$%'),
constraintscte
AS
(SELECT
ac.owner
,ac.table_name
xname
,'TABLE'
xtype
,acr.owner
referenced_owner
,acr.table_name
referenced_name
,'TABLE'
referenced_type
FROM
all_constraints ac
INNER
JOIN
all_constraints
acr
ON
ac.r_owner =
acr.owner
AND
ac.r_constraint_name =
acr.constraint_name
WHERE
ac.owner = '&owner'
AND
NOT
ac.table_name LIKE
'BIN$%'
AND
NOT
ac.table_name LIKE
'DMRS_%'
AND
NOT
ac.table_name LIKE
'DMRV_%'
AND
NOT
ac.table_name LIKE
'DT_%'
AND
NOT
ac.table_name LIKE
'CG$%'
AND
ac.constraint_type = 'R'),
nonreferencedobjectscte
AS
(SELECT
*
FROM
objectscte
oc
WHERE
NOT
EXISTS
(SELECT
1
FROM
constraintscte cc
WHERE
cc.referenced_owner =
oc.owner
AND
cc.referenced_name =
oc.object_name
AND
cc.referenced_type =
oc.object_type)),
orphanedobjectscte
AS
(SELECT
*
FROM
nonreferencedobjectscte
nroc
WHERE
NOT
EXISTS
(SELECT
1
FROM
constraintscte cc
WHERE
cc.owner =
nroc.owner
AND
cc.xname =
nroc.object_name
AND
cc.xtype =
nroc.object_type)),
nonorphanedobjectscte
AS
(SELECT
*
FROM
nonreferencedobjectscte
nroc
WHERE
EXISTS
(SELECT
1
FROM
constraintscte cc
WHERE
cc.owner =
nroc.owner
AND
cc.xname =
nroc.object_name
AND
cc.xtype =
nroc.object_type)),
constraintsrecursivecte(owner,
xname,
xtype,
xdepth,
xpath) AS
(SELECT
nooc.owner
,nooc.object_name
,nooc.object_type
,1
,to_clob(nooc.owner || '.'
|| nooc.object_name)
FROM
nonorphanedobjectscte
nooc
UNION
ALL
SELECT
cc.referenced_owner
,cc.referenced_name
,cc.referenced_type
,crc.xdepth
+ 1
,to_clob(to_char(crc.xpath) || '\'
||
cc.referenced_owner
|| '.'
||
cc.referenced_name)
FROM
constraintsrecursivecte
crc
INNER
JOIN
constraintscte cc
ON
crc.owner =
cc.owner
AND
crc.xname =
cc.xname
AND
crc.xtype =
cc.xtype) search depth
FIRST
BY
owner,
xname,
xtype
SET
xorder cycle
owner,
xname,
xtype
SET
xcycle TO
1
DEFAULT
0
SELECT
owner, xname,
xtype,
xdepth,
to_char(xpath), xorder,
xcycle
FROM
constraintsrecursivecte;