【问题标题】:Oracle find dependent columns of function based indexOracle查找基于函数的索引的依赖列
【发布时间】:2015-07-02 09:52:06
【问题描述】:

如何创建查询以返回从基于 Oracle 函数的索引中引用的用户列?

例如。我创建了一个索引,例如:

CREATE INDEX MY_INDEX ON MY_TABLE (SQRT(MY_COL));

对于基于非函数的索引,我只查询 ALL_IND_COLUMNS,例如:

SELECT INDEX_NAME, COLUMN_NAME, COLUMN_POSITION
FROM ALL_IND_COLUMNS 
WHERE INDEX_NAME = 'MY_INDEX' 

但是,此查询返回系统生成列的 COLUMN_NAME,例如“SYS_NC00012$”,而不是基于函数的索引使用的实际表列“MY_COL”。

我知道我可以查询 DBMS_METADATA 并读取返回的索引创建 DDL

SELECT DBMS_METADATA.GET_DDL('INDEX', 'MY_INDEX') AS QUERY_STRING FROM DUAL    

但这意味着我必须解析对我的目的而言不可靠的函数文本。

因此,谁能给我指出正确的方向,我该如何精确地确定基于函数的索引定义在哪些实际表列上?

【问题讨论】:

标签: oracle plsql


【解决方案1】:
 SQL> Create table my_table ( my_col int);
 Table Created;

 SQL> CREATE INDEX MY_INDEX ON MY_TABLE (SQRT(MY_COL));
 Index Created 

 SQL> select
  2     table_name c1,
  3     index_name c2,
  4     column_expression c3
  5  from
  6     dba_ind_expressions
  7  where
  8     table_name='MY_TABLE';


 Table                     Index
 name                      Name                      Expression
 ------------------------ ------------------------- ---------------------------------------
 MY_TABLE                  MY_INDEX                  SQRT("MY_COL")

【讨论】:

  • 感谢您的建议,但它返回必须为列名解析的完整表达式。我正在寻找一种仅列出列名(没有任何无关文本)的解决方案。
【解决方案2】:

你可以用“COMMENT ON COLUMN”做一些技巧,试试这个

Create table my_table ( my_col int);

CREATE INDEX MY_INDEX ON MY_TABLE (SQRT(my_col));

COMMENT ON COLUMN my_table.my_col    IS 'MY_INDEX:my_col'; -- add your index:col 

select * from ALL_COL_COMMENTS where table_NAME ='MY_TABLE'

你可以使用这个技巧基于函数的索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 2019-06-05
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    相关资源
    最近更新 更多