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

标签 oracle plsql

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

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,'ASC','', ' ' || 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

关于oracle - 如何在一个脚本中更改 Oracle 模式上的所有索引 (10G),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14158391/

相关文章:

database - 如何在 oracle 11g 快捷版中创建数据库?

oracle - 在 Oracle 中从另一个存储过程调用一个存储过程

sql - MySQL 相当于 Oracle 中的 DECODE 函数

sql - 如何将变量从shell脚本传递给sqlplus

sql - ORACLE PL/SQL 检查字符串是否为NULL

sql - 将表中的数据存储到对象表中

database - 如何在实体-属性-值设计中处理不同的数据类型(例如,具有多列的单个表或每种数据类型的多个表)?

oracle - 条件编译 PL/SQL

Oracle - 审计跟踪

oracle - Plsql 未初始化的集合