Ok ik zie dat de code hier en daar wat netter kan. Maar ‘t doet ‘t wel, voor als je wil weten hoe het hele referentiele plan is opgesteld in je schema. (Zie ook de vervolg post).
SELECT TAC.table_name
, TAC.column_name
, tac.data_type||' ('||CASE WHEN data_precision IS NOT NULL
THEN data_precision|| CASE WHEN data_scale > 0
THEN ',' || data_scale
ELSE NULL
END
ELSE TO_CHAR (data_length)
END || ')' datatype
, CASE WHEN tac.nullable='N'
THEN 'NOT NULL'
END nullability
, CASE WHEN pk.position IS NOT NULL
THEN '(PK)'
END pk
, CASE WHEN fk.constraint_name IS NOT NULL
THEN '(FK)'
END fk
FROM all_tab_columns tac
LEFT OUTER JOIN (SELECT cons.constraint_name
, cons.table_name
, conc.column_name
, conc.position
FROM all_constraints cons
LEFT OUTER JOIN all_cons_columns conc
ON cons.constraint_name = conc.constraint_name
AND cons.owner = conc.owner
WHERE cons.owner = '<OWNER>'
AND constraint_type = 'P') pk
ON pk.column_name = tac.column_name
AND pk.table_name = tac.table_name
LEFT OUTER JOIN (SELECT cons.constraint_name
, cons.table_name
, conc.column_name
, conc.position
--, cons.*
FROM all_constraints cons
LEFT OUTER JOIN all_cons_columns conc
ON cons.constraint_name = conc.constraint_name
AND cons.owner = conc.owner
WHERE cons.owner = '<OWNER>'
AND constraint_type = 'R') fk
ON fk.column_name = tac.column_name
AND fk.table_name = tac.table_name
WHERE tac.owner = '<OWNER>'
ORDER BY tac.table_name
, pk.position
, tac.column_name