Oracle查询(PROC)未给出期望的结果

问题描述 投票:1回答:1

当在查询(在proc内)oracle下面运行时。

sql oracle
1个回答
1
投票

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取得的。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.