当在查询(在proc内)oracle下面运行时。
与user_ind_expressions
左加入。如果该表的值不为null,则从该表中获取值;否则,从user_index_columns
中获取。然后,您可以进行分层查询,或者也许listagg()
会更好。
一个问题。 Column_expression
的数据类型很长(至少我以这种形式看到它),所以我做了一个简单的函数即可将其转换为varchar(您可以改进它,请阅读适当的文章,例如在Asktom网站上)。
create or replace function
get_expr(i_tn in varchar2, i_in in varchar2, i_cp in number) return varchar2 as
l_data long;
begin
select column_expression into l_data from user_ind_expressions
where table_name = i_tn and index_name = i_in and column_position = i_cp;
return substr(l_data, 1, 4000);
end;
这是我的测试数据和查询:
create table emp(id primary key, fname, lname, dept) as (
select 707, 'Pete', 'Griffin', 'Sales' from dual);
create index idx_emp1 on emp(lower(dept));
create index idx_emp2 on emp(upper(lname), upper(fname));
和查询:
select index_name,
ltrim(sys_connect_by_path(index_keys,','),',') as Index_Keys
from (
select t.*, row_number() over (partition by index_name order by column_position) as rn
from (
select index_name, column_name, column_position,
nvl(get_expr(table_name, index_name, column_position), column_name) as index_keys
from user_indexes di
join user_ind_columns ci using (table_name, index_name)
left join user_ind_expressions using (table_name, index_name, column_position)
where table_name = 'EMP') t )
where connect_by_isleaf = 1
connect by index_name = prior index_name and rn = prior rn+1
start with rn = 1
和结果:
INDEX_NAME INDEX_KEYS
--------------- --------------------------------
IDX_EMP1 LOWER("DEPT")
IDX_EMP2 UPPER("LNAME"),UPPER("FNAME")
SYS_C00148175 ID
如您所见,ID是从user_ind_columns
取得的,其他键是从user_ind_expressions
取得的。