Oracle 11 g DBMS_REDEFINITION修改表数据类型

  

11 g DBMS_REDEFINITION修改表数据类型

  

1。获取源表结构信息   

     ,
 SYS@honor1 的在SET  LONG  999999
  SYS@honor1 祝辞,SELECT  DBMS_METADATA.GET_DDL(& # 39;表# 39;& # 39;TEST_REDE& # 39;, & # 39;人力资源# 39;),得到双;
  CREATE  TABLE “HR" !”TEST_REDE"
  (才能,,,“称,VARCHAR2 (30),
  ,,,,,,“OBJECT_NAME", VARCHAR2 (128),
  ,,,,,,“SUBOBJECT_NAME", VARCHAR2 (30),
  ,,,,,,“OBJECT_ID", VARCHAR2 (20),
  ,,,,,,“DATA_OBJECT_ID",,
  ,,,,,,“OBJECT_TYPE", VARCHAR2 (19),
  ,,,,,,“CREATED",日期,
  ,,,,,,“LAST_DDL_TIME",日期,
  ,,,,,,“TIMESTAMP", VARCHAR2 (19),
  ,,,,,,“STATUS", VARCHAR2 (7),
  ,,,,,,“TEMPORARY", VARCHAR2 (1),
  ,,,,,,“GENERATED", VARCHAR2 (1),
  ,,,,,,“SECONDARY", VARCHAR2 (1),
  ,,,,,,“NAMESPACE",,
  ,,,,,,“EDITION_NAME", VARCHAR2 (30)
  ),才能
  ,TABLESPACE “USERS"; 
  

2。验证是否可以在线重定义   

     
 #,由于表没有主键,所以只能使用ROWID,如果表有主键,可以删掉CONS_USE_ROWID,默认使用PK
  开始
  DBMS_REDEFINITION.CAN_REDEF_TABLE(& # 39;人力资源# 39;,& # 39;TEST_REDE& # 39;,
  DBMS_REDEFINITION.CONS_USE_ROWID);
  结束;/
  

3。创建中间表,修改需要修改的列数据类型   

     <>以前CREATE  TABLE “HR"干净TEST_REDE_INTER"   (,,,“称,VARCHAR2 (30),   ,,,,“OBJECT_NAME", VARCHAR2 (128),   ,,,,“SUBOBJECT_NAME", VARCHAR2 (30),   ,,,,“OBJECT_ID", VARCHAR2 (20),   ,,,,“DATA_OBJECT_ID", VARCHAR2(10),,,,,,,,,,,需要修改后的数据类型   ,,,,“OBJECT_TYPE", VARCHAR2 (19),   ,,,,“CREATED",日期,   ,,,,“LAST_DDL_TIME",日期,   ,,,,“TIMESTAMP", VARCHAR2 (19),   ,,,,“STATUS", VARCHAR2 (7),   ,,,,“TEMPORARY", VARCHAR2 (1),   ,,,,“GENERATED", VARCHAR2 (1),   ,,,,“SECONDARY", VARCHAR2 (1),   ,,,,“NAMESPACE",,   ,,,,“EDITION_NAME", VARCHAR2 (30)   )   TABLESPACE “USERS";   

4。开始在线重定义,   

     <>以前alter  session  force  parallel  dml  parallel  4;   alter  session  force  parallel  query  parallel  4;   开始   DBMS_REDEFINITION.START_REDEF_TABLE (   uname =祝辞,& # 39;人力资源# 39;   orig_table =祝辞,& # 39;TEST_REDE& # 39;   int_table =祝辞,& # 39;TEST_REDE_INTER& # 39;   时间=祝辞col_mapping    & # 39;OWNER 老板,,,,,,,,   OBJECT_NAME  OBJECT_NAME,   SUBOBJECT_NAME  SUBOBJECT_NAME,   OBJECT_ID  OBJECT_ID,   to_char (DATA_OBJECT_ID), DATA_OBJECT_ID,,,,,,由于更改数据类型,需要手工转换   OBJECT_TYPE  OBJECT_TYPE,   CREATED 创建,   LAST_DDL_TIME  LAST_DDL_TIME,   TIMESTAMP 时间戳,   STATUS 状态,   TEMPORARY 暂时的,   GENERATED 生成的,   SECONDARY 二次,   NAMESPACE 名称空间,   EDITION_NAME  EDITION_NAME& # 39;   options_flag =祝辞,DBMS_REDEFINITION.CONS_USE_ROWID);   结束;/   

5。同步中间数据,减少finish_redef_table时间   

     <>之前开始   ,,,dbms_redefinition.sync_interim_table (uname ,,,,,,,=祝辞,& # 39;和用户名,,   ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,orig_table =祝辞,& # 39;及,SOURCE_TAB& # 39;   ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,int_table ,=祝辞,& # 39;,INT_TAB& # 39;);   结束;/   

6。复制相关约束,依赖对象   

     
 #,如果更改了列名,或者增加列,必要时,手工创建相关索引等对象
  声明
  ,,,num_errors  PLS_INTEGER;
  开始
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null

Oracle 11 g DBMS_REDEFINITION修改表数据类型