-oracle数据库恢复-Raid5数据恢复-RAID0数据恢复ORACLE优化与疑难问题讨论区 → 在数据字典中直接修改Oracle表列名


  共有2648人关注过本帖树形打印

主题:在数据字典中直接修改Oracle表列名

oracle数据恢复-RAID5数据恢复-raid数据恢复
sosdb
  1楼 个性首页 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


数据恢复 恢复数据
等级:超级版主 帖子:809 积分:10386 威望:0 精华:1 注册:2007-1-28 11:50:49
在数据字典中直接修改Oracle表列名  发帖心情 Post By:2007-3-10 16:33:56










在数据字典中直接修改Oracle表列名






 





Oracle数据库没有提供直接修改表中列名称的功能,但在实际使用时常需要修改表的列名和列顺序,不得已有些Oracle的使用人员用重新创建一个新的具有正确列名和顺序的数据库表,再将旧表的数据转储进来,最后删除旧表并将新表重命名为旧表的方法来完成此功能。此方法的最大问题是要求有双倍的存储空间、较大的回滚段和较长的时间,如果表中数据量较大,这项工作开销会很大。实际上我们可以从数据字典中直接修改表列的名称和顺序。下面是具体的实现步骤:

1.以internal用户名登录Oracle数据库,并创建一测试表。






  SQL>CREATE TABLE SCOTT.TEST AS SELECT EMPNO,ENAME FROM SCOTT.EMP; 
  
  SQL>DESC SCOTT.TEST
  
  Name Type Nullable Def***t Comments
  
  ------- ------------ -------
  
  EMPNO NUMBER(4) Y
  
  ENAME VARCHAR2(10) Y
  

下面我们要把SCOTT.TEST表中EMPNO和ENAME两列调换顺序,并把ENAME列更名为EMP_NAME,EMPNO改为EMP_NO。

2.查询表中列的实际存储位置或表。






  SQL>SET LONG 9999
  

由于TEXT列是LONG类型,只有“SET”之后才能完全显示。






  
  SQL>SELECT TEXT FROM ALL_VIEWS
WHERE VIEW_NAME = ‘USER_TAB_COLUMNS’;
  

数据字典视图USER_TAB_COLUMNS中存储有表列的定义信息,从该语句的查询结果可以看出,列定义信息是存储在表SYS.COL$中的,即如果修改表中列的定义,应该在SYS.COL$表中修改。

3.从数据字典视图ALL_OBJECTS中查找对象SCOTT.TEST对象ID。






  SQL> SELECT * FROM ALL_OBJECTS WHERE OWNER =‘SCOTT’ 
AND OBJECT_NAME=‘TEST’;
  

4.根据SCOTT.TEST对象的ID,从SYS.COL$检索出表中列的定义信息。






  SQL> SELECT OBJ#,COL#,NAME FROM SYS.COL$ WHERE OBJ# =13888; 
  
  OBJ# COL# NAME
  
  ---------- ---------- -------
  
  13888 1 EMPNO
  
  13888 2 ENAME
  

5.使用Update语句来进行修改。






  UPDATE SYS.COL$ SET COL# = 2,NAME=‘EMP_NO’ 
WHERE OBJ# = 13888 AND NAME=‘EMPNO’;
  
  UPDATE SYS.COL$ SET COL# = 1,NAME=‘EMP_NAME’
WHERE OBJ# = 13888 AND NAME =‘ENAME’;
  
  COMMIT;
  

6. 重启数据库服务。

由于数据字典是在数据库启动时加载到SQL中的,所以修改了它之后,如果使用“SELECT * FROM SCOTT.TEST; ”,会发现好像并没有修改。因此,修改完成之后,还需要重启数据库服务。






  
  SQL>SHUTDOWN
  
  SQL>STARTUP
  

这时,再查看,就会发现修改已经成功。

 





 
  SQL> SELECT * FROM SCOTT.TEST;
  
  EMP_NAME EMP_NO
  
  ---------- ------
  
  SMITH 7369
  
  ALLEN 7499
  
  WARD 7521
  
  ……
 
 

这种方法直接从数据库中进行表列定义的修改,存在一定风险,但它对于数据量特别大的表是非常有用的。充分利用数据字典功能,往往能够完成日常很难完成的工作。


[此贴子已经被作者于2007-3-10 16:35:06编辑过]


www.sosdb.com 专业数据库恢复

oracle数据恢复raid数据恢复

qq:9417901

msn:glkgdj@hotmail.com

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
oracle数据恢复-RAID5数据恢复-raid数据恢复
sosdb
  2楼 个性首页 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


数据恢复 恢复数据
等级:超级版主 帖子:809 积分:10386 威望:0 精华:1 注册:2007-1-28 11:50:49
  发帖心情 Post By:2007-3-10 16:45:16

icol$ /* index column table */
ccol$ /* constraint column table */
cdef$ /* constraint definition table */


这都是ORACLE的系统表,经常有人问ORACLE系统表的事情,顺便贴出来



www.sosdb.com 专业数据库恢复

oracle数据恢复raid数据恢复

qq:9417901

msn:glkgdj@hotmail.com

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
oracle数据恢复-RAID5数据恢复-raid数据恢复
老三good
  3楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


数据恢复 恢复数据
等级:新手上路 帖子:21 积分:156 威望:0 精华:0 注册:2007-1-29 9:08:07
  发帖心情 Post By:2007-3-12 9:11:13

管,改变列的名称用


COLUMN column_name HEADING column_heading


可以不


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
oracle数据恢复-RAID5数据恢复-raid数据恢复
sosdb
  4楼 个性首页 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


数据恢复 恢复数据
等级:超级版主 帖子:809 积分:10386 威望:0 精华:1 注册:2007-1-28 11:50:49
  发帖心情 Post By:2007-3-13 16:59:16

管,改变列的名称用


COLUMN column_name HEADING column_heading


可以不


详细说



www.sosdb.com 专业数据库恢复

oracle数据恢复raid数据恢复

qq:9417901

msn:glkgdj@hotmail.com

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
oracle数据恢复-RAID5数据恢复-raid数据恢复
stone_kai
  5楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


数据恢复 恢复数据
等级:新手上路 帖子:6 积分:387 威望:0 精华:0 注册:2007-1-30 20:33:11
  发帖心情 Post By:2007-6-22 20:45:53

顶一下 

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部

返回版面帖子列表

在数据字典中直接修改Oracle表列名








签名