oracle

インデックス対象カラム名がSYS_XXXと表示されて困る

インデックスの対象カラムを調べる際、dba_ind_columnsを参照しますよね。この時たまに”SYS_XXX”っていうカラム名が出てきて気になりませんか?

select t.INDEX_NAME,t.TABLE_OWNER,t.TABLE_NAME,t.COLUMN_NAME,t.COLUMN_POSITION,t.COLUMN_LENGTH,t.CHAR_LENGTH,t.DESCEND
 from dba_ind_columns t where t.TABLE_NAME ='MST_ADDRESS'
order by t.TABLE_OWNER,t.TABLE_NAME,t.INDEX_NAME,t.COLUMN_POSITION
;

これら3つのINDEXは以下のように作成しています。ファンクションインデックスを使ったり、逆順ソートが指定された場合このように見えるようです。マニュアルを見ると『列の名前、またはオブジェクト型列の属性』となっていまた。ファンクションインデックスは納得ですが、逆順ソートの指定でもこのようになるってちょっと納得いかないです、、、

create index IDX_MST_ADDRESS_01  on MST_ADDRESS (CITY_NAME asc);
create index IDX_MST_ADDRESS_02  on MST_ADDRESS (OAZA_TOWN_CHOME_NAME desc);
create index IDX_MST_ADDRESS_03  on MST_ADDRESS (to_char(LATITUDE) asc,to_char(LONGITUDE) asc,PREFECTURES_NAME);
DBA_IND_EXPRESSIONSを参照したら解決します
select t.INDEX_OWNER,t.INDEX_NAME,t.COLUMN_POSITION,t.COLUMN_NAME, i.COLUMN_EXPRESSION,t.DESCEND from dba_ind_columns t
left join dba_ind_expressions i
on i.index_owner = t.index_owner
and i.index_name = t.index_name
and i.column_position = t.column_position
where t.TABLE_NAME = 'MST_ADDRESS' and t.TABLE_OWNER ='SOONI'
--and t.INDEX_NAME ='IDX_TEST_TABLE1'
order by t.TABLE_NAME,t.INDEX_NAME,t.COLUMN_POSITION,t.COLUMN_NAME
;
実はこれで『本当の解決』にはなっていないのです、、

実は上記の表示はちょっと不本意なのです。本当はcase文や、decode文を使いcolumn_nameカラムとcolumn_expression列を同一列にまとめたかったんですが、これができないのです。。。。column_expression列があの「忌まわしき」LONG型であるため挫折してしまいました。これを解決するにはPL/SQLを使うしかないような、、、少し考えます。LONG型といったら、Oracle11g時代のマニュアルに以下のように書いてあるにもかかわらず12cになっても内部ではLONG使っているなんて納得いかないです、、(19c使ってみましたが同じくLONG使っていました。これ直す気ないんですかね、、)

LONG列を含む表は、作成しないことをお薦めします。LONG列は、下位互換性のためにのみサポートされています。かわりにLOB列(BLOB、BFILE、CLOB、NCLOB)を使用してください。LOB列は、LONG列より制限が少なく、現在でも機能が拡張されています。

https://docs.oracle.com/cd/E16338_01/server.112/b56314/ch_twelve040.htm

2021/09/21いまいちですが、とりあえず代替案考えてやってみたのが以下です。

スポンサーリンク
コピペで使う