Oracle 無直接 ALTER TABLE ... MOVE COLUMN 改變欄位順序。若需在工具 (如 PL/SQL Developer) 中調整顯示順序,可直接更新系統表 SYS.COL$ 的 COL# 欄位(內部欄位序號)。操作有風險,需在維護窗口、備份後由 DBA 執行。
SYS 或具備 SELECT ANY DICTIONARY 權限用戶登入。OBJECT_ID:
SELECT object_id
FROM all_objects
WHERE owner = 'FINACE' AND object_name = 'INCOME';
-- 假設回傳 51221
SELECT obj#, col#, name
FROM sys.col$
WHERE obj# = 51221
ORDER BY col#;
COL# 值交換順序(例:將第 3 欄移至第 1 位):
-- 需確保無重複 COL#,建議先將目標欄位改為臨時大數值,再依序重新編號
UPDATE sys.col$ SET col# = 999 WHERE obj# = 51221 AND name = 'TARGET_COL';
UPDATE sys.col$ SET col# = 1 WHERE obj# = 51221 AND name = 'TARGET_COL';
-- 其餘欄位依序遞增...
COMMIT;
ALTER SYSTEM FLUSH SHARED_POOL;
CREATE TABLE new_table AS SELECT col3, col1, col2 FROM old_table;
DROP TABLE old_table;
RENAME new_table TO old_table;
-- 重建索引、約束、授權、同義詞
ALTER TABLE ... MODIFY (col INVISIBLE) 後再 VISIBLE,順序會移至末尾,配合多次操作可間接調整。除非極特殊需求 (如舊版報表工具強制依賴欄位順序),強烈建議採用重建表方式,安全可控且符合最佳實踐。