LISTING 1
CREATE TABLE all_tables_csv AS
SELECT
	owner,
	LTRIM(SYS_CONNECT_BY_PATH(table_name, ','), ',') AS object_name
FROM (
		SELECT
			owner,
			  table_name,
			  row_number() over(PARTITION BY owner ORDER BY owner,table_name) rnum,
			  count(9) over(PARTITION BY owner) tot FROM (
			SELECT owner,table_name, rank() over (partition by owner order by table_name) AS rnk FROM all_tables)
			WHERE rnk <=12
			)
WHERE
	rnum=tot
	START WITH rnum = 1
	CONNECT BY PRIOR rnum = rnum -1 AND PRIOR owner = owner
LISTING 2
SELECT
	max_occurence,
	rank
FROM
	(SELECT
	   level max_occurence
	FROM
	   dual CONNECT BY level <=
	   (SELECT
		  MAX(LENGTH(object_name)-LENGTH(REPLACE(object_name,',','')))/LENGTH(',') + 1 cnt
	   FROM
		  all_tables_csv
	   )
	),
	(SELECT
	   level rank
	FROM
	   dual CONNECT BY level <=
	   (SELECT
		  MAX(LENGTH(object_name)-LENGTH(REPLACE(object_name,',','')))/LENGTH(',') + 1 cnt
	   FROM
		  all_tables_csv
	   )
	)
WHERE
	CASE
	   WHEN rank > max_occurence THEN 'y' ELSE 'n'
	END = 'n'
LISTING 3
SELECT
   owner,
   ',' || object_name,
   INSTR(',' || object_name,',',1,rank),
   INSTR(',' || object_name,',',1,rank+1),
   CASE
      WHEN INSTR(',' || object_name,',',1,rank+1) = 0 THEN SUBSTR(',' || object_name,INSTR(',' || object_name,',',1,rank)+1,LENGTH(',' || object_name))
      ELSE SUBSTR(',' || object_name,INSTR(',' || object_name,',',1,rank)+1,INSTR(',' || object_name,',',1,rank+1)-INSTR(',' || object_name,',',1,rank)-1)
   END AS object_name,
   --INSTR(',' || emps,',',1,rank-1),
   LENGTH(object_name)-LENGTH(REPLACE(object_name,',',''))/LENGTH(',') + 1 cnt,
   b.rank
FROM
   all_tables_csv a
   JOIN (
      SELECT
            max_occurence,
            rank
		FROM
			(SELECT
				level max_occurence
			FROM
				dual CONNECT BY level <=
				(SELECT
					MAX(LENGTH(object_name)-LENGTH(REPLACE(object_name,',','')))/LENGTH(',') + 1 cnt
				FROM
					all_tables_csv
				)
         ),
		(SELECT
			level rank
		FROM
			dual CONNECT BY level <=
			(SELECT
				MAX(LENGTH(object_name)-LENGTH(REPLACE(object_name,',','')))/LENGTH(',') + 1 cnt
			FROM
				all_tables_csv
			)
		)
           WHERE  CASE
               WHEN rank > max_occurence THEN 'y' ELSE 'n'
            END = 'n'
      ) b
   ON LENGTH(object_name)-LENGTH(REPLACE(object_name,',',''))/LENGTH(',') + 1 = max_occurence