Oracle 10g 修改表列名与顺序的解决方案- 下面介绍通过修改数值字典的方法修改表的列名: 
   
  假设在 SCOTT帐号下有HB_TEST 表: 
 -------------------------------------------------------------------- 
--目的:调换STU_ID和STU_NAME的顺序;并把STU_ID 改为S_ID; 
 SQL>SELECT * FROM HB_TEST; 
 /** 
     STU_ID STU_NAME   CRO_NAME        GRADE 
 ---------- ---------- ---------- ---------- 
          1 张三       语文               68 
          2 李四       语文               88 
          3 王五       语文               72 
          4 小张       语文               65 
          1 张三       数学               90 
          2 李四       数学               62 
          3 王五       数学               94 
          4 小张       数学               75 
          1 张三       物理               50 
          2 李四       物理               60 
          3 王五       物理               70 
          4 小张       物理               80 
 */ 
 --第一步: 
 SQL>select OBJECT_name,object_id from all_objects 
     2 where object_name='HB_TEST'; 
 /** 
 OBJECT_NAME                     OBJECT_ID 
 ------------------------------ ---------- 
 HB_TEST                             49214 
 */ 
 --第二步:切换到sys帐号下 
 SQL>conn / as sysdba; 
 --第三步: 
 SQL>select obj#,col#,name from col$ where obj#=49214; 
 /** 
       OBJ#       COL# NAME 
 ---------- ---------- ---------- 
      49214          1 STU_ID 
      49214          2 STU_NAME 
      49214          3 CRO_NAME 
      49214          4 GRADE    
 */ 
 --第四步: 下面可以通过修改这个系统表来使成为事实修改列名与顺序,注意,COL#就是列的顺序。 
 SQL>UPDATE COL$ SET COL#=2,name='S_ID' 
    2 WHERE OBJ#=49214 and name='STU_ID'; 
 /** 
      OBJ#       COL# NAME 
 --------- ---------- --------- 
     49214          2 S_ID 
     49214          2 STU_NAME 
     49214          3 CRO_NAME 
     49214          4 GRADE 
 */ 
 --再更新STU_NAME 的col# 的值; 
 SQL>UPDATE COL$ SET COL#=1,name='STU_NAME' 
     2 WHERE OBJ#=49214 and name='STU_NAME'; 
   
 --第五步:再次查询 
 SQL>select obj#,col#,name from col$ where obj#=49214; 
 /** 
       OBJ#       COL# NAME 
 --------- ---------- -------- 
     49214          2 S_ID 
     49214          1 STU_NAME 
     49214          3 CRO_NAME 
     49214          4 GRADE 
 */   
     
 --第六步:提交修改 
 SQL>commit; 
 --第七步: 重启服务 
 SQL>SHUTDOWN IMMEDIATE; --关闭 
 SQL>STARTUP;     --开启 
 --第八步:登录SCOTT账号,查询 
 SQL>SELECT * FROM HB_TEST; 
 /** 
 STU_NAME         S_ID CRO_NAME        GRADE 
 ---------- ---------- ---------- ---------- 
 张三                1 语文               68 
 李四                2 语文               88 
 王五                3 语文               72 
 小张                4 语文               65 
 张三                1 数学               90 
 李四                2 数学               62 
 王五                3 数学               94 
 小张                4 数学               75 
 张三                1 物理               50 
 李四                2 物理               60 
 王五                3 物理               70 
 小张                4 物理               80 
 */ 
 --第九步:查看表结构 
 SQL>desc HB_TEST; 
 /** 
 名称 
 -------------- 
 STU_NAME 
 S_ID 
 CRO_NAME 
 GRADE 
 */ 
 -------------------------------------------------------------------- 
 还有一种方法: 
   如果创建表好了后,想修改表的定义可以使用alter table 命令,但是如果要修改列名或调整列的顺序时,alter table 命令将无能为力。当然可以使用原始措施,通过(create table 临时表 as select * from 源表 ),之后把原来的表删除,再重修,之后使用  (insert into 新表 select 列1,列2 from 临时表 ) 就能够处理完成了,但是这样做需要有足够大的空间。 









