I was wondering whether there is a possibility for me to discover the underlying primary (or unique) key columns for all tables involved in an Oracle view. Here\'s an exampl
You can find that information via the user_dependencies view:
SQL> CREATE TABLE t_a
2 ( id number(7)
3 , primary key(id)
4 )
5 /
Table created.
SQL> CREATE VIEW v_a AS SELECT * FROM t_a
2 /
View created.
SQL> select c.constraint_name
2 from user_dependencies d
3 , all_constraints c
4 where d.name = 'V_A'
5 and d.referenced_type = 'TABLE'
6 and d.referenced_link_name is null
7 and d.referenced_owner = c.owner
8 and d.referenced_name = c.table_name
9 and c.constraint_type = 'P'
10 /
CONSTRAINT_NAME
------------------------------
SYS_C0051559
1 row selected.
Regards,
Rob.
EDIT: For possible view column names, you can use this query. Note there is no guarantee that such a column exists in your view.
SQL> select c.constraint_name
2 , 'V_' || substr(c.table_name,3) || '.' || cc.column_name possible_view_column
3 from user_dependencies d
4 , all_constraints c
5 , all_cons_columns cc
6 where d.name = 'V_A'
7 and d.referenced_type = 'TABLE'
8 and d.referenced_link_name is null
9 and d.referenced_owner = c.owner
10 and d.referenced_name = c.table_name
11 and c.constraint_type = 'P'
12 and c.owner = cc.owner
13 and c.constraint_name = cc.constraint_name
14 /
CONSTRAINT_NAME POSSIBLE_VIEW_COLUMN
------------------------------ -------------------------------------------------------------
SYS_C0051561 V_A.ID
1 row selected.
SELECT column_name FROM user_ind_columns
WHERE index_name =
(SELECT index_name FROM user_constraints
WHERE constraint_type='P' AND table_name='T_A')
ORDER BY column_position;
If you want to do it for all tables that a view depends on, then change the condition on table_name to something like:
table_name IN (SELECT referenced_name FROM user_dependencies
WHERE name='view_name' AND referenced_type='TABLE')