このクエリは、依存する要素の総数に従ってステートメントを並べ替えることができます。結果として得られる順序は、ほとんど問題なく機能します。「ブルート フォース」アプローチの 2 番目のパスには、(削除する数千のオブジェクトのうち) ほんの一握りのオブジェクトしか含まれていません。
問題、それは非常に遅いです...
EDIT :クエリにタイプミスがあり、多かれ少なかれ正しいデータが返されましたが、非常に遅くなりました。
WITH FIRST_LEVEL_DEPENDENCIES (BSCHEMA, BNAME, DTYPE, DSCHEMA, DNAME) AS
(
SELECT T1.TABSCHEMA AS BSCHEMA, T1.TABNAME AS BNAME, T1.BTYPE, T1.BSCHEMA, T1.BNAME
FROM SYSCAT.TABDEP T1
WHERE T1.TABSCHEMA NOT LIKE 'SYS%'
AND T1.BTYPE <> 'N'
UNION ALL
SELECT T1.ROUTINESCHEMA AS BSCHEMA, T1.SPECIFICNAME AS BNAME, T1.BTYPE, T1.BSCHEMA, T1.BNAME
FROM SYSCAT.ROUTINEDEP T1
WHERE T1.ROUTINESCHEMA NOT LIKE 'SYS%'
AND T1.BTYPE <> 'N'
UNION ALL
SELECT T1.TABSCHEMA AS BSCHEMA, T1.TABNAME AS BNAME, 'T', T1.REFTABSCHEMA, T1.REFTABNAME
FROM SYSCAT.REFERENCES T1
WHERE T1.TABSCHEMA NOT LIKE 'SYS%'
),
RECURSIVE_DEPENDENCIES (LEVEL, BSCHEMA, BNAME, DTYPE, DSCHEMA, DNAME) AS
(
SELECT 1, U.BSCHEMA, U.BNAME, U.DTYPE, U.DSCHEMA, U.DNAME
FROM FIRST_LEVEL_DEPENDENCIES AS U
UNION ALL
SELECT LEVEL + 1, REC.BSCHEMA, REC.BNAME, U.DTYPE, U.DSCHEMA, U.DNAME
FROM RECURSIVE_DEPENDENCIES REC,
FIRST_LEVEL_DEPENDENCIES U
WHERE LEVEL < 6
AND U.BSCHEMA = REC.DSCHEMA
AND U.BNAME = REC.DNAME
)
SELECT BSCHEMA, BNAME, COUNT(*)
FROM RECURSIVE_DEPENDENCIES
GROUP BY BSCHEMA, BNAME
ORDER BY COUNT(*)