我需要向Oracle模式的所有索引添加一个新列,因为数据库将开始存储历史记录并具有新的日期字段.由于现有索引是唯一的,我需要将它们全部删除并再次创建它们,但是新索引包含新列.如果使用系统视图的单列基于所有索引,这将是相当容易的:
select 'CREATE INDEX ' || index_name || ' ON ' || table_name || ' (' || column_name || ',NEWCOLUMNNAME)'
from sys.all_ind_columns
where table_owner = 'SCHEMA_OWNER'
Run Code Online (Sandbox Code Playgroud)
但显然我问,因为并非我的所有索引都是基于单列的.这是我需要在像TOAD这样的IDE上执行的东西.数据库版本为10g.
试试这个
对于Oracle 11g:
SELECT 'CREATE INDEX ' || INDEX_NAME || ' ON '
|| TABLE_NAME || ' (' || COL_LIST || ',NEWCOLUMNNAME)'
FROM (
Select index_name,table_name,
LISTAGG(COLUMN_NAME || DECODE(DESCEND,'ASC','', ' ' || DESCEND), ',')
WITHIN GROUP (ORDER BY COLUMN_POSITION) AS COL_LIST
FROM SYS.ALL_IND_COLUMNS
GROUP BY index_name,table_name
);
Run Code Online (Sandbox Code Playgroud)
对于Oracle 10g,您可以使用:
SELECT 'CREATE INDEX ' || INDEX_NAME || ' ON '
|| TABLE_NAME || ' (' || COL_LIST || ',NEWCOLUMNNAME)'
FROM (
SELECT INDEX_NAME,TABLE_NAME,
REGEXP_REPLACE(XMLAGG (XMLELEMENT(E, COLUMN_NAME ||
DECODE(DESCEND,'ASC','', ' ' || DESCEND) ||',')
ORDER BY COLUMN_POSITION).EXTRACT('//text()'), '\s*,\s*$', '') AS COL_LIST
FROM SYS.ALL_IND_COLUMNS
GROUP BY INDEX_NAME,TABLE_NAME
);
Run Code Online (Sandbox Code Playgroud)
供参考 - 不同字符串聚合技术的列表