加入收藏 | 设为首页 | 会员中心 | 我要投稿 宁德站长网 (https://www.0593zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在一个脚本中更改Oracle模式的所有索引(10G)

发布时间:2021-03-30 23:20:02 所属栏目:百科 来源:网络整理
导读:我需要向Oracle模式的所有索引添加一个新列,因为数据库将开始存储历史记录并具有新的日期字段.由于现有索引是唯一的,我需要将它们全部删除并再次创建它们,但是新索引包含新列.如果使用系统视图的单列基于所有索引,这将是相当容易的: select 'CREATE INDEX

我需要向Oracle模式的所有索引添加一个新列,因为数据库将开始存储历史记录并具有新的日期字段.由于现有索引是唯一的,我需要将它们全部删除并再次创建它们,但是新索引包含新列.如果使用系统视图的单列基于所有索引,这将是相当容易的:

select 'CREATE INDEX ' || index_name || ' ON ' || table_name || ' (' || column_name || ',NEWCOLUMNNAME)' 

from sys.all_ind_columns 

where table_owner = 'SCHEMA_OWNER'

但显然我问,因为并非我的所有索引都是基于单列的.这是我需要在像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
);

对于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,' ' || DESCEND) ||',') 
       ORDER BY COLUMN_POSITION).EXTRACT('//text()'),'s*,s*$','') AS  COL_LIST 
       FROM SYS.ALL_IND_COLUMNS
       GROUP BY INDEX_NAME,TABLE_NAME
 );

供参考 – List of different string aggregation techniques

(编辑:宁德站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!