CREATE OR REPLACE PROCEDURE test_con(p_table_owner IN varchar2, p_table_name IN varchar2, p_result OUT sys_refcursor) AS BEGIN OPEN p_result
FOR
SELECT *
FROM
(SELECT CASE
WHEN uc.constraint_type ='C' THEN
(SELECT DECODE(COUNT(*), 1, 'CHECK on single column', 'CHECK Table level')
FROM dba_cons_columns ucc2
WHERE ucc2.constraint_name = uc.constraint_name
AND ucc2.owner = uc.owner
AND ucc2.table_name = uc.table_name)
WHEN uc.constraint_type = 'P' THEN 'PRIMARY KEY'
ELSE ''
END AS constraint_type,
uc.constraint_name AS CONSTRAINT_NAME,
uc.delete_rule AS "DELETE_ACTION",
NULL AS "UPDATE_ACTION",
uc.status AS "STATUS_ENABLED",
NULL AS "STATUS_FOR_REPLICATION",
uc.search_condition AS "CONSTRAINT_KEYS",
NULL AS data_compression,
NULL AS default_uid,
NULL AS partition_qty,
(SELECT LISTAGG(ucc1.column_name, ',') WITHIN GROUP (ORDER BY ucc1.column_name)
FROM dba_cons_columns ucc1
WHERE uc.constraint_name = ucc1.constraint_name
AND uc.table_name = ucc1.table_name
AND uc.owner = ucc1.owner) AS column_names
FROM dba_constraints uc
WHERE uc.OWNER = 'HR'
AND uc.TABLE_NAME = 'EMP'
);
END;
SELECT *
FROM
(SELECT CASE
WHEN uc.constraint_type ='C' THEN
(SELECT DECODE(COUNT(*), 1, 'CHECK on single column', 'CHECK Table level')
FROM dba_cons_columns ucc2
WHERE ucc2.constraint_name = uc.constraint_name
AND ucc2.owner = uc.owner
AND ucc2.table_name = uc.table_name)
WHEN uc.constraint_type = 'P' THEN 'PRIMARY KEY'
ELSE ''
END AS constraint_type,
uc.constraint_name AS CONSTRAINT_NAME,
uc.delete_rule AS "DELETE_ACTION",
NULL AS "UPDATE_ACTION",
uc.status AS "STATUS_ENABLED",
NULL AS "STATUS_FOR_REPLICATION",
uc.search_condition AS "CONSTRAINT_KEYS",
NULL AS data_compression,
NULL AS default_uid,
NULL AS partition_qty,
(SELECT LISTAGG(ucc1.column_name, ',') WITHIN GROUP (ORDER BY ucc1.column_name)
FROM dba_cons_columns ucc1
WHERE uc.constraint_name = ucc1.constraint_name
AND uc.table_name = ucc1.table_name
AND uc.owner = ucc1.owner) AS column_names
FROM dba_constraints uc
WHERE uc.OWNER = 'HR'
AND uc.TABLE_NAME = 'EMP'
);
SELECT *
FROM
(SELECT CASE
WHEN uc.constraint_type ='C' THEN
(SELECT DECODE(COUNT(*), 1, 'CHECK on single column', 'CHECK Table level')
FROM dba_cons_columns ucc2
WHERE ucc2.constraint_name = uc.constraint_name
AND ucc2.owner = uc.owner
AND ucc2.table_name = uc.table_name)
WHEN uc.constraint_type = 'P' THEN 'PRIMARY KEY'
ELSE ''
END AS constraint_type,
uc.constraint_name AS CONSTRAINT_NAME,
uc.delete_rule AS "DELETE_ACTION",
NULL AS "UPDATE_ACTION",
uc.status AS "STATUS_ENABLED",
NULL AS "STATUS_FOR_REPLICATION",
uc.search_condition AS "CONSTRAINT_KEYS",
NULL AS data_compression,
NULL AS default_uid,
NULL AS partition_qty,
(SELECT LISTAGG(ucc1.column_name, ',') WITHIN GROUP (ORDER BY ucc1.column_name)
FROM dba_cons_columns ucc1
WHERE uc.constraint_name = ucc1.constraint_name
AND uc.table_name = ucc1.table_name
AND uc.owner = ucc1.owner) AS column_names
FROM dba_constraints uc
WHERE uc.OWNER = 'HR'
AND uc.TABLE_NAME = 'EMP'
);
SELECT *
FROM
(SELECT CASE
WHEN uc.constraint_type ='C' THEN
(SELECT DECODE(COUNT(*), 1, 'CHECK on column ' || LISTAGG(ucc2.column_name, ',') WITHIN GROUP (ORDER BY ucc2.column_name) , 'CHECK Table level')
FROM dba_cons_columns ucc2
WHERE ucc2.constraint_name = uc.constraint_name
AND ucc2.owner = uc.owner
AND ucc2.table_name = uc.table_name)
WHEN uc.constraint_type = 'P' THEN 'PRIMARY KEY (clustered)'
WHEN uc.constraint_type = 'DEFAULT' THEN 'DEFAULT on column ' || ucc1.column_name
ELSE ''
END AS constraint_type,
uc.constraint_name AS CONSTRAINT_NAME,
uc.delete_rule AS "DELETE_ACTION",
NULL AS "UPDATE_ACTION",
uc.status AS "STATUS_ENABLED",
NULL AS "STATUS_FOR_REPLICATION",
uc.search_condition AS "CONSTRAINT_KEYS",
NULL AS data_compression,
NULL AS default_uid,
NULL AS partition_qty,
(SELECT LISTAGG(ucc1.column_name, ',') WITHIN GROUP (ORDER BY ucc1.column_name)
FROM dba_cons_columns ucc1
WHERE uc.constraint_name = ucc1.constraint_name
AND uc.table_name = ucc1.table_name
AND uc.owner = ucc1.owner) AS column_names
FROM dba_constraints uc,
dba_cons_columns ucc1
WHERE uc.constraint_name = ucc1.constraint_name
AND uc.table_name = ucc1.table_name
AND uc.owner = ucc1.owner
AND uc.OWNER = 'HR'
AND uc.TABLE_NAME = 'EMP'
UNION ALL SELECT 'DEFAULT on column ' || cc.column_name,
'DF_' || cc.column_name AS CONSTRAINT_NAME,
NULL AS "DELETE_ACTION",
NULL AS "UPDATE_ACTION",
NULL AS "STATUS_ENABLED",
NULL AS "STATUS_FOR_REPLICATION",
cc.data_default AS "CONSTRAINT_KEYS",
NULL AS data_compression,
NULL AS default_uid,
NULL AS partition_qty,
cc.column_name
FROM dba_tab_columns cc
WHERE cc.owner='HR'
AND cc.table_name='EMP'
AND data_default IS NOT NULL );
SELECT *
FROM
(SELECT CASE
WHEN uc.constraint_type ='C' THEN
(SELECT DECODE(COUNT(*), 1, 'CHECK on column ' || LISTAGG(ucc2.column_name, ',') WITHIN GROUP (ORDER BY ucc2.column_name) , 'CHECK Table level')
FROM dba_cons_columns ucc2
WHERE ucc2.constraint_name = uc.constraint_name
AND ucc2.owner = uc.owner
AND ucc2.table_name = uc.table_name)
WHEN uc.constraint_type = 'P' THEN 'PRIMARY KEY (clustered)'
WHEN uc.constraint_type = 'DEFAULT' THEN 'DEFAULT on column '
ELSE ''
END AS constraint_type,
uc.constraint_name AS CONSTRAINT_NAME,
uc.delete_rule AS "DELETE_ACTION",
NULL AS "UPDATE_ACTION",
uc.status AS "STATUS_ENABLED",
NULL AS "STATUS_FOR_REPLICATION",
uc.search_condition AS "CONSTRAINT_KEYS",
NULL AS data_compression,
NULL AS default_uid,
NULL AS partition_qty,
(SELECT LISTAGG(ucc1.column_name, ',') WITHIN GROUP (ORDER BY ucc1.column_name)
FROM dba_cons_columns ucc1
WHERE uc.constraint_name = ucc1.constraint_name
AND uc.table_name = ucc1.table_name
AND uc.owner = ucc1.owner) AS column_names
FROM dba_constraints uc
WHERE
uc.OWNER = 'HR'
AND uc.TABLE_NAME = 'EMP'
UNION ALL SELECT 'DEFAULT on column ' || cc.column_name,
'DF_' || cc.column_name AS CONSTRAINT_NAME,
NULL AS "DELETE_ACTION",
NULL AS "UPDATE_ACTION",
NULL AS "STATUS_ENABLED",
NULL AS "STATUS_FOR_REPLICATION",
cc.data_default AS "CONSTRAINT_KEYS",
NULL AS data_compression,
NULL AS default_uid,
NULL AS partition_qty,
cc.column_name
FROM dba_tab_columns cc
WHERE cc.owner='HR'
AND cc.table_name='EMP'
AND data_default IS NOT NULL );
SELECT *
FROM
(SELECT CASE
WHEN uc.constraint_type ='C' THEN
(SELECT DECODE(COUNT(*), 1, 'CHECK on column ' || LISTAGG(ucc2.column_name, ',') WITHIN GROUP (ORDER BY ucc2.column_name) , 'CHECK Table level')
FROM dba_cons_columns ucc2
WHERE ucc2.constraint_name = uc.constraint_name
AND ucc2.owner = uc.owner
AND ucc2.table_name = uc.table_name)
WHEN uc.constraint_type = 'P' THEN 'PRIMARY KEY (clustered)'
WHEN uc.constraint_type = 'DEFAULT' THEN 'DEFAULT on column '
ELSE ''
END AS constraint_type,
uc.constraint_name AS CONSTRAINT_NAME,
uc.delete_rule AS "DELETE_ACTION",
NULL AS "UPDATE_ACTION",
uc.status AS "STATUS_ENABLED",
NULL AS "STATUS_FOR_REPLICATION",
uc.search_condition AS "CONSTRAINT_KEYS",
NULL AS data_compression,
NULL AS default_uid,
NULL AS partition_qty,
(SELECT LISTAGG(ucc1.column_name, ',') WITHIN GROUP (ORDER BY ucc1.column_name)
FROM dba_cons_columns ucc1
WHERE uc.constraint_name = ucc1.constraint_name
AND uc.table_name = ucc1.table_name
AND uc.owner = ucc1.owner) AS column_names
FROM dba_constraints uc
WHERE
uc.OWNER = 'HR'
AND uc.TABLE_NAME = 'T'
UNION ALL SELECT 'DEFAULT on column ' || cc.column_name,
'DF_' || cc.column_name AS CONSTRAINT_NAME,
NULL AS "DELETE_ACTION",
NULL AS "UPDATE_ACTION",
NULL AS "STATUS_ENABLED",
NULL AS "STATUS_FOR_REPLICATION",
cc.data_default AS "CONSTRAINT_KEYS",
NULL AS data_compression,
NULL AS default_uid,
NULL AS partition_qty,
cc.column_name
FROM dba_tab_columns cc
WHERE cc.owner='HR'
AND cc.table_name='T'
AND data_default IS NOT NULL );
For check constraint(table level like BONUS_CK)...it should display data only in one row with comma-separated column names...
like bonus,tax
Now it displays 2 rows for table level constraint i.e bonus_ck Also query should work with all versions(10g,11g,12c)
Please help with eliminating this duplicate row for table level...