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