T
This script can be used for quick compare of two similar tables (like audit/historic or DML error tables) so you can easily check if columns and their data types matches.
WITH z AS (
SELECT
'UPLOADERS' AS first_name, -- base table
'UPLOADERS' || '_U$' AS second_name -- audit/hist/error table
FROM DUAL
),
c AS (
SELECT
c.table_name AS table_name,
c.column_name AS column_name,
c.column_id AS column_id,
--
CASE
WHEN c.data_type = 'NUMBER' THEN
c.data_type ||
CASE WHEN c.data_precision IS NOT NULL THEN '(' || c.data_precision || DECODE(c.data_scale, 0, '', ', ' || c.data_scale) || ')' END
WHEN c.data_type IN ('CHAR', 'VARCHAR', 'VARCHAR2') THEN
c.data_type || '(' ||
DECODE(c.char_used, 'C', c.char_length || ' CHAR', c.data_length) || ')'
ELSE c.data_type
END AS data_type
FROM user_tab_cols c
WHERE c.table_name IN (
SELECT z.first_name FROM z UNION ALL
SELECT z.second_name FROM z
)
),
a AS (
SELECT
a.column_id AS first_pos,
a.table_name AS first_table,
a.column_name AS first_column,
a.data_type AS first_data_type,
--
b.column_id AS second_pos,
b.table_name AS second_table,
b.column_name AS second_column,
b.data_type AS second_data_type
FROM c a
JOIN z
ON z.first_name = a.table_name
LEFT JOIN c b
ON b.table_name = z.second_name
AND b.column_name = a.column_name
),
b AS (
SELECT
a.column_id AS first_pos,
a.table_name AS first_table,
a.column_name AS first_column,
a.data_type AS first_data_type,
--
b.column_id AS second_pos,
b.table_name AS second_table,
b.column_name AS second_column,
b.data_type AS second_data_type
FROM c b
JOIN z
ON z.second_name = b.table_name
LEFT JOIN c a
ON a.table_name = z.first_name
AND a.column_name = b.column_name
WHERE a.table_name IS NULL
)
--
SELECT first_table, first_column, second_column, first_data_type, second_data_type
FROM (
SELECT * FROM a UNION ALL
SELECT * FROM b
)
ORDER BY first_pos NULLS LAST, second_pos;
Comments
Post a Comment