4

データベースは履歴の保存を開始し、新しい日付フィールドがあるため、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 です。

4

1 に答える 1

9

これを試して

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
 );

参照用 - さまざまな文字列集計手法のリスト

于 2013-01-04T13:57:16.297 に答える