2009-06-24 15 views
2

私は、列の1つがNumber(22,12)である表を持っていますが、その数はNumber(22,2)でなければなりません。データが入っているので、列を正しい精度に変更することはできません。Oracle番号の列を変更する

カラムを固定する最も効率的な方法は何でしょうか?

前に言及しなかったことの1つは、テーブルに複数のインデックスとトリガがあり、他のテーブルにリンクされていることです。

答えて

5
ALTER TRIGGER trfoobar DISABLE; 
ALTER TABLE foobar ADD (newcol number); 
UPDATE foobar SET newcol=oldcol, oldcol=null; 
ALTER TABLE foobar MODIFY(oldcol number(22,2)); 
UPDATE foobar SET oldcol=newcol; 
ALTER TABLE foobar DROP(newcol); 
ALTER TRIGGER trfoobar ENABLE; 
+0

ありがとう、それは私が必要とするものです。 –

+0

ニースのソリューションammoQ –

+0

nice ...それは優れたイディオムです。 –

0

あなたは、データをエクスポートするテーブルを削除、再作成およびインポートや

は正しい定義を持つ新しいテーブルを作成してから行うことができます:(SELECT

INSERT/* + APPEND */NEW_TABLE INTO * FROM old_table);

古いテーブルを削除し、新しいテーブルの名前を古いテーブルに変更します。

ALTER TABLE new_table RENAME TO old_table;

+0

古いテーブルを削除すると、他のテーブルのリンクはどうなりますか? –

2

変換中に表をオンラインにする必要があり、データベースに必要な権限がある場合は、DBMS_REDEFINITIONを使用できます。このリンクには詳細情報があります。 。

テーブルをオンラインにする必要がない場合は、新しいデータ型の列を追加し、データをコピーしてから元の列を削除するのが最も簡単な方法です。列の順序を同じにする必要がある場合は、元の表のビューを作成できます。

ビューを使用したくない場合は、新しいテーブルを作成し、データをコピーして古いテーブルを削除してから、新しいテーブルの名前を変更することができます。 >可能であれば、古いテーブルのソリューションをドロップ - データを移動するために何かをする> - 新しいテーブルを作成する> -

+0

+1、すべてがこのユーティリティによってあなたの世話をしてくれます... – DCookie

0

私はいつもリネームテーブルを避けるようにしてください。これを複雑にするPL/SQLの無効化、再作成の許可、ロックなどは常に考慮されます。

トリガが関与列を参照しない場合、私はなります

  • 更新newColVal = oldColVal
  • ドロップを設定するためのテーブル(明らかに異なる名前で)新しい列を追加古い列
  • 古い名前に列の名前を変更するには、

これに対する1つのマイナーな欠点は、新しい列開発ツールがテーブルを記述しているときにテーブルの列リストの最後に表示されます。これは私を悩ませることはありませんでしたが、いくつかの点で問題になります。

Daniel E.が指摘しているように、DBMS_REDEFINITIONパッケージはこれに代わるものですが、私の経験上、この設定を正しく実行するには時間がかかります。ダウンタイムがまったくないシステムのオンライン変更を実行する必要がある場合は、この手法を学ぶ価値があります。