This request can order approvals according to the total number of elements on which they depend. The resulting order works almost without failures, the second pass of the brute force approach contains only a few objects (out of several thousand objects to be deleted).
The problem is, it is very slow ...
EDIT: There was a typo in the request that made it return more or less correct data, but very slowly.
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(*)