如何创建查询以返回从基于Oracle函数的索引引用的用户列?
EG。我创建了一个索引,如:
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
但这意味着我必须解析对我来说不可靠的函数文本。
因此,任何人都可以指出我正确的方向,我如何能够精确地确定哪个实际的表列是基于函数的索引定义的?
答案 0 :(得分:2)
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")
答案 1 :(得分:-1)
你可以用“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'
你可以使用这个基于特技功能的索引。