11G DBMS_REDEFINITION修改表数据类型
1.获取源表结构信息
SYS@honor1 > SET LONG 999999
SYS@honor1 > SELECT DBMS_METADATA.GET_DDL('TABLE','TEST_REDE','HR') FROM DUAL;
CREATE TABLE "HR"."TEST_REDE"
( "OWNER" VARCHAR2(30),
"OBJECT_NAME" VARCHAR2(128),
"SUBOBJECT_NAME" VARCHAR2(30),
"OBJECT_ID" VARCHAR2(20),
"DATA_OBJECT_ID" NUMBER,
"OBJECT_TYPE" VARCHAR2(19),
"CREATED" DATE,
"LAST_DDL_TIME" DATE,
"TIMESTAMP" VARCHAR2(19),
"STATUS" VARCHAR2(7),
"TEMPORARY" VARCHAR2(1),
"GENERATED" VARCHAR2(1),
"SECONDARY" VARCHAR2(1),
"NAMESPACE" NUMBER,
"EDITION_NAME" VARCHAR2(30)
)
TABLESPACE "USERS";
2.验证是否可以在线重定义
# 由于表没有主键,所以只能使用ROWID,如果表有主键,可以删掉CONS_USE_ROWID,默认使用PK
BEGIN
DBMS_REDEFINITION.CAN_REDEF_TABLE('HR','TEST_REDE',
DBMS_REDEFINITION.CONS_USE_ROWID);
END;
/
3.创建中间表,修改需要修改的列数据类型
CREATE TABLE "HR"."TEST_REDE_INTER" ( "OWNER" VARCHAR2(30), "OBJECT_NAME" VARCHAR2(128), "SUBOBJECT_NAME" VARCHAR2(30), "OBJECT_ID" VARCHAR2(20), "DATA_OBJECT_ID" VARCHAR2(10), --需要修改后的数据类型 "OBJECT_TYPE" VARCHAR2(19), "CREATED" DATE, "LAST_DDL_TIME" DATE, "TIMESTAMP" VARCHAR2(19), "STATUS" VARCHAR2(7), "TEMPORARY" VARCHAR2(1), "GENERATED" VARCHAR2(1), "SECONDARY" VARCHAR2(1), "NAMESPACE" NUMBER, "EDITION_NAME" VARCHAR2(30) ) TABLESPACE "USERS";
4.开始在线重定义
alter session force parallel dml parallel 4; alter session force parallel query parallel 4; BEGIN DBMS_REDEFINITION.START_REDEF_TABLE( uname => 'HR', orig_table => 'TEST_REDE', int_table => 'TEST_REDE_INTER', col_mapping => 'OWNER 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 CREATED, LAST_DDL_TIME LAST_DDL_TIME, TIMESTAMP TIMESTAMP, STATUS STATUS, TEMPORARY TEMPORARY, GENERATED GENERATED, SECONDARY SECONDARY, NAMESPACE NAMESPACE, EDITION_NAME EDITION_NAME', options_flag => DBMS_REDEFINITION.CONS_USE_ROWID); END; /
5.同步中间数据,减少finish_redef_table时间
begin dbms_redefinition.sync_interim_table(uname => '&USERNAME', orig_table => '&SOURCE_TAB', int_table => '&INT_TAB'); end; /
6.复制相关约束,依赖对象
# 如果更改了列名,或者增加列,必要时,手工创建相关索引等对象 DECLARE num_errors PLS_INTEGER; BEGIN DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(uname => '&USERNAME', orig_table => '&SOURCE_TAB', int_table => '&INT_TAB', copy_indexes => DBMS_REDEFINITION.cons_orig_params, copy_triggers => TRUE, copy_constraints => TRUE, copy_privileges => TRUE, ignore_errors => FALSE, num_errors => num_errors, copy_statistics => TRUE); END; /
7.完成在线重定义
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 质量内建七步法(转载)
质量内建七步法(转载)
26-03-03 - 微信小程序怎么做
微信小程序怎么做
26-03-03 - Oracle RMAN备份实战
Oracle RMAN备份实战
26-03-03 - oracle19c对数据库客户端和jdbc版本要求
oracle19c对数据库客户端和jdbc版本要求
26-03-03 - ORA-00904: "wm_concat":invalid identifier错误如何解决?
- 都有哪些好用的项目管理工具?
都有哪些好用的项目管理工具?
26-03-03 - 甲骨文宣布Oracle自治数据库现可部署至客户数据中心
甲骨文宣布Oracle自治数据库现可部署至客户数据中心
26-03-03 - 企业应该怎样选择项目管理软件?
企业应该怎样选择项目管理软件?
26-03-03 - Oracle RAC Rolling Patching
Oracle RAC Rolling Patching
26-03-03 - 如何做好软件项目需求分析?
如何做好软件项目需求分析?
26-03-03
