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

我需要向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

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值