【发布时间】:2021-09-11 09:03:32
【问题描述】:
我正在使用 Oracle 作为 CRM 的数据库。
我被要求根据特定条件生成一个完整的索引列表,以便检查表名。
我找到并详细说明了以下查询:
select ind.index_name,
ind_col.column_name,
tab_cols.DATA_DEFAULT,
ind.table_name
from sys.all_indexes ind
inner join sys.all_ind_columns ind_col on
ind.owner = ind_col.index_owner and ind.index_name = ind_col.index_name
left outer join sys.all_TAB_COLS tab_cols on
ind_col.COLUMN_NAME = tab_cols.COLUMN_NAME and
INDEX_TYPE='FUNCTION-BASED NORMAL' and
tab_cols.OWNER = ind.owner and
ind_col.COLUMN_NAME like 'SYS_NC%' and
tab_cols.TABLE_NAME = ind.table_name
where [requested conditions]
order by ind.table_name,INDEX_NAME;
这个查询生成了大约 1.600 行,其中大部分是重复的 INDEX_NAME 值,因为如果索引有多个参数,我会重复该字段。
我想做的是:
- 将 ind_col.column_name 中定义的一个索引的所有值分组到一列中,逗号分隔
- (如果可能)具有 tab_cols.DATA_DEFAULT (long) 的值,而不是 ind_col.column_name,以防第一个值不为空。
我可以请你帮忙吗?
非常感谢您的回复!
【问题讨论】:
-
查看
LISTAGG以获取逗号分隔列表和NVL或NVL2以处理NULL/NOT NULL 值 -
DATA_DEFAULT 不是 CLOB 而是 LONG 不幸的是,它非常非常难以保存转换为 VARCHAR2。我最终在我的 DBMS(Oracle 19c 企业版)上遇到了数据库故障“SP2-0642:SQL*Plus 内部错误状态 2147,上下文 0:0:0 无法安全继续”。
标签: sql oracle indexing group-by system