転載する場合は出典を明記してください!
ORACLE を使用したことがある人なら誰でも、ORACLE での列名とテーブルの順序の変更が非常に面倒な作業であることを知っています。そのための簡単な方法を次に示します。
SQL> select object_id from all_objects where owner='SCOTT' and object_name='T1';
OBJECT_ID
----------
6067
SQL> select obj#,col#,name from sys.col$ where obj#=6067;
OBJ# COL#
---------- ---- ------
名前
------------------------------------- -----------------------
6067 1
ID
6067 2
名前
SQL> update sys.col$ set name='NEW_ID' ,col#=3 where obj#=6067 and name='ID';
1 行が更新されました。
SQL> .col$ set name='MY_NAME',col#=1 where obj#=6067 and name='NAME';
1 行が更新されました。
SQL> sys.col$ set を更新しました。 col#=2、obj#=6067 およびcol#=3;
1 行が更新されました。
SQL> commit;
コミットが完了しました。
SQL> select * from scott.t1;
ID NAME
---------- --------------------
3 cheng
2 yong
1 xin
2 gototop
1 topcio
2 yongxin
1 cyx
7 行が選択されました。
SQL>即時シャットダウン
データベースが閉じられました。
データベースがマウント解除されました。
ORACLE インスタンスがシャットダウンされました。
SQL>起動
ORACLE インスタンスが開始されました。
合計システム グローバル領域 128159368 バイト
固定サイズ 732808 バイト
可変サイズ 117440512 バイト
データベース バッファー 8388608 バイト
やり直しバッファー 1597440 バイト
データベースがマウントされました。
データベースがオープンされました。
SQL>select * from scott.t1;
MY_NAME NEW_ID
---------------------- ----------
チェン 3
ヨン 2
xin 1
gototop 2
topcio 1
yongxin 2
cyx 1
7 行が選択されました。
これまでのところ、SCOTT.T1 列があります。テーブル内の名前と順序は指定されていますが、列名は変更せずに順序のみを変更したい場合は、一度に UPDATE を実行するだけで済みます。これは、SYS の COL# と NAME が原因です。 COL$ はどちらも UNIQUE です。
この方法には一定のリスクがありますが、特に大きなテーブルでは効果が明らかですが、一般的な方法を使用すると、より多くのストレージ領域、ロールバックセグメント、および時間のオーバーヘッドが必要になります。