在9I前我们一般通过MOVE的方式来对表的数据重整,如果表非常大,而IO又不块的时候,MOVE的的过程可能相当漫长,
甚至不能在线完成,而且还需要REBUILD索引,这样降低的高可用性。
因此9I提出了DBMS_REDEFINITION包引入了在线表重定义的功能。
该原理类似MV-物化视图
在线重定义由三个大的步骤组成
完全同步 => 增量同步 =>切换
注: oracle9i环境中,不要在sys用户下做,否则会出错,如下部分
SQL> conn /as sysdba
已连接。
SQL>
SQL> create table t1
2 as
3 select * from stage
4 order by dbms_random.random;
表已创建。
SQL> begin
2 for x in 1..10
3 loop insert into t1
4 select OWNER,OBJECT_NAME,SUBOBJECT_NAME,object_id+x*100000,DATA_OBJECT_ID,OBJECT_TYPE,
5 CREATED,LAST_DDL_TIME,TIMESTAMP,STATUS,TEMPORARY,GENERATED,SECONDARY from stage;
6 commit;
7 end loop;
8 end;
9 /
PL/SQL 过程已成功完成。
SQL> alter table t1 add constraint check_gt_zero check (object_id>0);
表已更改。
SQL> create trigger t1_trigger
2 before insert on t1
3 begin
4 dbms_output.put_line( 'hello world' );
5 end;
6 /
create trigger t1_trigger
*
ERROR 位于第 1 行:
ORA-04089: 无法对 SYS 所有的对象创建触发器
SQL> exec dbms_redefinition.can_redef_table( user, 'T1' );
BEGIN dbms_redefinition.can_redef_table( user, 'T1' ); END;
*
ERROR 位于第 1 行:
ORA-12087: 在 "SYS" 拥有的表上不允许联机重新定义
ORA-06512: 在"SYS.DBMS_REDEFINITION", line 8
ORA-06512: 在"SYS.DBMS_REDEFINITION", line 247
ORA-06512: 在line 1
下面准备切换到scott用户上测试
SQL> conn /as sysdba
已连接。
SQL> create table scott.stage as select *from stage;
表已创建。
SQL> conn scott/tiger
已连接。
SQL> drop table t1;
表已丢弃。
SQL> create table t1
2 as
3 select * from stage
4 order by dbms_random.random;
表已创建。
SQL> alter table t1 add constraint check_gt_zero check (object_id>0);
表已更改。
SQL> create trigger t1_trigger
2 before insert on t1
3 begin
4 dbms_output.put_line( 'hello world' );
5 end;
6 /
触发器已创建
SQL> select 'indexes', index_name from user_indexes where table_name = 'T1'
2 union all
3 select 'constraints', constraint_name from user_constraints where table_name = 'T1'
4 union all
5 select 'triggers', trigger_name from user_triggers where table_name = 'T1';
'INDEXES' INDEX_NAME
----------- ------------------------------
constraints SYS_C003068
constraints SYS_C003069
constraints SYS_C003070
constraints SYS_C003071
constraints SYS_C003072
constraints CHECK_GT_ZERO
triggers T1_TRIGGER
已选择7行。
SQL> desc t1
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
OWNER NOT NULL VARCHAR2(30)
OBJECT_NAME NOT NULL VARCHAR2(30)
SUBOBJECT_NAME VARCHAR2(30)
OBJECT_ID NOT NULL NUMBER
DATA_OBJECT_ID NUMBER
OBJECT_TYPE VARCHAR2(18)
CREATED NOT NULL DATE
LAST_DDL_TIME NOT NULL DATE
TIMESTAMP VARCHAR2(19)
STATUS VARCHAR2(7)
TEMPORARY VARCHAR2(1)
GENERATED VARCHAR2(1)
SECONDARY VARCHAR2(1)
SQL> create table t2 (
2 OWNER VARCHAR2(30) not null,
3 OBJECT_NAME VARCHAR2(30) not null,
4 SUBOBJECT_NAME VARCHAR2(30),
5 OBJECT_ID NUMBER not null,
6 DATA_OBJECT_ID NUMBER,
7 OBJECT_TYPE VARCHAR2(19),
8 CREATED DATE not null,
9 LAST_DDL_TIME DATE not null,
10 TIMESTAMP VARCHAR2(19),
11 STATUS VARCHAR2(7),
12 TEMPORARY VARCHAR2(1),
13 GENERATED VARCHAR2(1),
14 SECONDARY VARCHAR2(1),
15 NAMESPACE NUMBER, == 新增的列
16 EDITION_NAME VARCHAR2(30) == 新增的列
17 ) partition by hash(object_id) partitions 8; == 设置HASH分区
表已创建。
SQL> exec dbms_redefinition.can_redef_table( user, 'T1' ); ==判断这个表是否能在线重定义,9I只有主键1种,10G还有BY ROWID
BEGIN dbms_redefinition.can_redef_table( user, 'T1' ); END;
*
ERROR 位于第 1 行:
ORA-06550: 第 1 行, 第 7 列:
PLS-00201: 必须说明标识符 'DBMS_REDEFINITION'
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored
==执行失败,因为没有权限
SQL> conn /as sysdba
已连接。
SQL> GRANT EXECUTE ON DBMS_REDEFINITION TO SCOTT; ==这里必须有执行包的权限,注意,即使有DBA权限也没用
授权成功。
SQL> GRANT EXECUTE_CATALOG_ROLE TO SCOTT;
授权成功。
SQL> GRANT CREATE ANY TABLE TO SCOTT;
授权成功。
SQL> GRANT ALTER ANY TABLE TO SCOTT;
授权成功。
SQL> GRANT DROP ANY TABLE TO SCOTT;
授权成功。
SQL> GRANT LOCK ANY TABLE TO SCOTT;
授权成功。
SQL> GRANT SELECT ANY TABLE TO SCOTT;
授权成功。
SQL> conn scott/tiger
已连接。
== 下面开始验证是否可以采用PK重定义表,不报错即可
SQL> exec DBMS_REDEFINITION.CAN_REDEF_TABLE('SCOTT', 'T1' , dbms_redefinition.cons_use_pk);
BEGIN DBMS_REDEFINITION.CAN_REDEF_TABLE('SCOTT', 'T1' , dbms_redefinition.cons_use_pk); END;
*
ERROR 位于第 1 行:
ORA-12089: 不能联机重新定义无主键的表 "SCOTT"."T1" == 因为9I默认重定义是基于主键,主键没有,创建不成功
ORA-06512: 在"SYS.DBMS_REDEFINITION", line 8
ORA-06512: 在"SYS.DBMS_REDEFINITION", line 247
ORA-06512: 在line 1
SQL> alter table t1 add constraint t1_pk primary key(object_id);
表已更改。
SQL> exec DBMS_REDEFINITION.CAN_REDEF_TABLE('SCOTT', 'T1' , dbms_redefinition.cons_use_pk);
PL/SQL 过程已成功完成。
== 检查通过,开始重定义
exec dbms_redefinition.start_redef_table( user, 'T1', 'T2','OWNER OWNER ,OBJECT_NAME OBJECT_NAME ,SUBOBJECT_NAME SUBOBJECT_NAME ,OBJECT_ID OBJECT_ID ,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 ,0 NAMESPACE, ''YES'' EDITION_NAME')
*
ERROR 位于第 1 行:
ORA-12091: 不能联机重新定义具有实体化视图的表 "SCOTT"."T1"
ORA-06512: 在"SYS.DBMS_REDEFINITION", line 8
ORA-06512: 在"SYS.DBMS_REDEFINITION", line 146
ORA-06512: 在line 1
SQL> exec dbms_redefinition.start_redef_table( user, 'T1', 'T2')
BEGIN dbms_redefinition.start_redef_table( user, 'T1', 'T2'); END;
*
ERROR 位于第 1 行:
ORA-12006: 具有相同 user.name 的实体化视图已经存在 --有时候测试会报这个错误
ORA-06512: 在"SYS.DBMS_REDEFINITION", line 8
ORA-06512: 在"SYS.DBMS_REDEFINITION", line 146
ORA-06512: 在line 1
==解决办法:我们需要将之前步骤中产生的物化视图和日志删除。用下列语句查找并清除:
SQL> select log_table from user_snapshot_logs;
LOG_TABLE
------------------------------
MLOG$_ADMIN_EMP
MLOG$_T1
SQL>
SQL>
SQL> drop snapshot log on t1;
==实体化视图日志已删除。
SQL> select TABLE_NAME , status from user_snapshots;
TABLE_NAME STATUS
------------------------------ -------
INT_ADMIN_EMP VALID
T2 VALID
==以前称为SNAPSHOT
==以后的版本称为MVIEW,物化视图
SQL> select mview_name, compile_state from user_mviews;
MVIEW_NAME COMPILE_STATE
------------------------------ -------------------
INT_ADMIN_EMP ERROR
T2 ERROR
SQL> drop materialized view T2;
==实体化视图已删除。
exec dbms_redefinition.start_redef_table( user, 'T1', 'T2','OWNER OWNER ,OBJECT_NAME OBJECT_NAME ,SUBOBJECT_NAME SUBOBJECT_NAME ,OBJECT_ID OBJECT_ID ,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 ,0 NAMESPACE, ''YES'' EDITION_NAME'')
PL/SQL 过程已成功完成。
SQL> SELECT COUNT(*) FROM t1;
COUNT(*)
----------
320661
SQL> SELECT COUNT(*) FROM t2;
COUNT(*)
----------
320661
-- 执行拷贝命令,关联相关对象
DECLARE
num_errors PLS_INTEGER;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('scott', 't1','t2',DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, num_errors);
END;
ERROR 位于第 4 行:
ORA-06550: 第 4 行, 第 78 列:
PLS-00302: 必须说明 'CONS_ORIG_PARAMS' 组件
ORA-06550: 第 4 行, 第 1 列:
PL/SQL: Statement ignored
== COPY_TABLE_DEPENDENTS 是10g的新特性,9i中不存在
SQL> alter table t2 add constraint t2_check_gt_zero check (object_id>0);
表已更改。
SQL> alter table t2 add constraint t2_pk primary key(object_id);
表已更改。
SQL> create trigger t2_trigger
2 before insert on t2
3 begin
4 dbms_output.put_line( 'hello world' );
5 end;
6 /
触发器已创建
SQL> select 'indexes', index_name from user_indexes where table_name = 'T1'
2 union all
3 select 'constraints', constraint_name from user_constraints where table_name = 'T1'
4 union all
5 select 'triggers', trigger_name from user_triggers where table_name = 'T1';
'INDEXES' INDEX_NAME
----------- ------------------------------
indexes T1_PK
constraints SYS_C003088
constraints SYS_C003089
constraints SYS_C003090
constraints SYS_C003091
constraints SYS_C003092
constraints CHECK_GT_ZERO
constraints T1_PK
triggers T1_TRIGGER
已选择9行。
SQL> select 'indexes', index_name from user_indexes where table_name = 'T2'
2 union all
3 select 'constraints', constraint_name from user_constraints where table_name = 'T2'
4 union all
5 select 'triggers', trigger_name from user_triggers where table_name = 'T2';
'INDEXES' INDEX_NAME
----------- ------------------------------
indexes T2_PK
constraints SYS_C003094
constraints SYS_C003095
constraints SYS_C003096
constraints SYS_C003097
constraints SYS_C003098
constraints T2_CHECK_GT_ZERO
constraints T2_PK
triggers T2_TRIGGER
已选择9行。
== session 2 插入一条新纪录 --
SQL> insert into t1(OWNER,OBJECT_NAME,OBJECT_ID,CREATED,LAST_DDL_TIME)
2 values ('SYS','HELLO',1888888,sysdate-1,sysdate);
已创建 1 行。
SQL> commit;
提交完成。
== 回到 session 1
==sync_interim_table能够将新增的数据同步到中间表,并且加速FINISH的同步工作量,FINISH会锁表
SQL> exec dbms_redefinition.sync_interim_table('scott', 't1', 't2');
PL/SQL 过程已成功完成。
SQL> select * from t2 where object_id=1888888;
OWNER OBJECT_NAME
------------------------------ ------------------------------
SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE
------------------------------ ---------- -------------- -------------------
CREATED LAST_DDL_T TIMESTAMP STATUS T G S NAMESPACE
---------- ---------- ------------------- ------- - - - ----------
EDITION_NAME
------------------------------
SYS HELLO
1888888
07-5月 -09 08-5月 -09 0
YES
SQL> SELECT COUNT(*) FROM t1;
COUNT(*)
----------
320662
SQL> SELECT COUNT(*) FROM t2;
COUNT(*)
----------
320662
==将中间表同步原表,完成重定义
SQL> exec dbms_redefinition.finish_redef_table('SCOTT','T1','T2')
PL/SQL 过程已成功完成。
SQL> desc t1
名称 是否为空? 类型
----------------------------------------- -------- ------------------
OWNER NOT NULL VARCHAR2(30)
OBJECT_NAME NOT NULL VARCHAR2(30)
SUBOBJECT_NAME VARCHAR2(30)
OBJECT_ID NOT NULL NUMBER
DATA_OBJECT_ID NUMBER
OBJECT_TYPE VARCHAR2(19)
CREATED NOT NULL DATE
LAST_DDL_TIME NOT NULL DATE
TIMESTAMP VARCHAR2(19)
STATUS VARCHAR2(7)
TEMPORARY VARCHAR2(1)
GENERATED VARCHAR2(1)
SECONDARY VARCHAR2(1)
NAMESPACE NUMBER
EDITION_NAME VARCHAR2(30)
SQL> select 'indexes', index_name from user_indexes where table_name = 'T1'
2 union all
3 select 'constraints', constraint_name from user_constraints where table_name = 'T1'
4 union all
5 select 'triggers', trigger_name from user_triggers where table_name = 'T1';
'INDEXES' INDEX_NAME
----------- ------------------------------
indexes T2_PK
constraints SYS_C003094
constraints SYS_C003095
constraints SYS_C003096
constraints SYS_C003097
constraints SYS_C003098
constraints T2_CHECK_GT_ZERO
constraints T2_PK
triggers T2_TRIGGER
已选择9行。
SQL> select count(*) from t1;
COUNT(*)
----------
320662
SQL> select * from t1 where object_id=1888888;
OWNER OBJECT_NAME
------------------------------ ------------------------------
SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE
------------------------------ ---------- -------------- -------------------
CREATED LAST_DDL_T TIMESTAMP STATUS T G S NAMESPACE
---------- ---------- ------------------- ------- - - - ----------
EDITION_NAME
------------------------------
SYS HELLO
1888888
07-5月 -09 08-5月 -09 0
YES
==增量的1888888记录也同步进去了
==注意,T2在START_REDEF_TABLE前可以建立索引、触发器、约束,这样在FINISH后不需要单独再进行交换
10G在线重定义测试
~~~~~~~~~~~~~~~
测试结果:
SQL> create table t1
2 as
3 select * from stage
4 order by dbms_random.random;
SQL> alter table t1 add constraint t1_pk primary key(object_id);
表已更改。
SQL> alter table t1 add constraint check_gt_zero check (object_id>0);
表已更改。
SQL> create trigger t1_trigger
2 before insert on t1
3 begin
4 dbms_output.put_line( 'hello world' );
5 end;
6 /
触发器已创建
SQL> select 'indexes', index_name from user_indexes where table_name = 'T1'
2 union all
3 select 'constraints', constraint_name from user_constraints where table_name = 'T1'
4 union all
5 select 'triggers', trigger_name from user_triggers where table_name = 'T1';
'INDEXES' INDEX_NAME
----------- ------------------------------
indexes T1_PK
constraints SYS_C005428
constraints SYS_C005429
constraints SYS_C005430
constraints SYS_C005431
constraints SYS_C005432
constraints T1_PK
constraints CHECK_GT_ZERO
triggers T1_TRIGGER
已选择9行。
SQL> desc t1
名称 是否为空? 类型
----------------------------------------------------------------- -------- -----------------------------------
OWNER NOT NULL VARCHAR2(30)
OBJECT_NAME NOT NULL VARCHAR2(30)
SUBOBJECT_NAME VARCHAR2(30)
OBJECT_ID NOT NULL NUMBER
DATA_OBJECT_ID NUMBER
OBJECT_TYPE VARCHAR2(19)
CREATED NOT NULL DATE
LAST_DDL_TIME NOT NULL DATE
TIMESTAMP VARCHAR2(19)
STATUS VARCHAR2(7)
TEMPORARY VARCHAR2(1)
GENERATED VARCHAR2(1)
SECONDARY VARCHAR2(1)
SQL> create table t2 (
2 OWNER VARCHAR2(30),
3 OBJECT_NAME VARCHAR2(30),
4 SUBOBJECT_NAME VARCHAR2(30),
5 OBJECT_ID NUMBER,
6 DATA_OBJECT_ID NUMBER,
7 OBJECT_TYPE VARCHAR2(19),
8 CREATED DATE,
9 LAST_DDL_TIME DATE,
10 TIMESTAMP VARCHAR2(19),
11 STATUS VARCHAR2(7),
12 TEMPORARY VARCHAR2(1),
13 GENERATED VARCHAR2(1),
14 SECONDARY VARCHAR2(1),
15 NAMESPACE NUMBER,
16 EDITION_NAME VARCHAR2(30)
17 ) partition by hash(object_id) partitions 8;
create table t2 (
*
第 1 行出现错误:
ORA-00955: 名称已由现有对象使用
SQL> drop table t2;
表已删除。
create table t2 (
OWNER VARCHAR2(30),
OBJECT_NAME VARCHAR2(30),
SUBOBJECT_NAME VARCHAR2(30),
OBJECT_ID NUMBER,
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) == 新增的列
) partition by hash(object_id) partitions 8;== 设置HASH分区
Table altered.
表已创建。
SQL> exec dbms_redefinition.can_redef_table( user, 'T1' );
PL/SQL 过程已成功完成。
SQL> exec dbms_monitor.session_trace_enable;
PL/SQL 过程已成功完成。
SQL> exec dbms_redefinition.start_redef_table( user, 'T1', 'T2', orderby_cols => 'OBJECT_ID' );
BEGIN dbms_redefinition.start_redef_table( user, 'T1', 'T2', orderby_cols => 'OBJECT_ID' ); END;
*
第 1 行出现错误:
ORA-01031: 权限不足
ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 50
ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 1343
ORA-06512: 在 line 1
--用sys登陆执行 start-------------------------------------------
SQL> exec dbms_redefinition.start_redef_table( 'TESTUSER', 'T1', 'T2', orderby_cols => 'OBJECT_ID' )
PL/SQL 过程已成功完成。
--用sys登陆执行 end-------------------------------------------
SQL> select object_id, object_name from t1 OLD_TABLE where rownum<=5;
OBJECT_ID OBJECT_NAME
---------- ------------------------------
28591 /7e59f4a3_SystemIdentity
27656 /c7e340d5_FontRenderContext
15623 /9be69f43_BasicSplitPaneUIFocu
37397 com/sun/mail/pop3/Status
7551 DBA_REPOBJECT
SQL> select object_id, object_name from t2 NEW_TABLE where rownum<=5;
OBJECT_ID OBJECT_NAME
---------- ------------------------------
931 V$PGA_TARGET_ADVICE
943 V$DLM_MISC
955 V$DLM_RESS
957 V$HVMASTER_INFO
984 V_$BH
--用sys登陆执行 start-------------------------------------------
SQL> variable nerrors number
SQL> begin
2 dbms_redefinition.copy_table_dependents
3 ( 'TESTUSER', 'T1', 'T2',
4 copy_indexes => dbms_redefinition.cons_orig_params,
5 num_errors => :nerrors );
6 end;
7 /
PL/SQL 过程已成功完成。
SQL> print nerrors
NERRORS
----------
0
--用sys登陆执行 end-------------------------------------------
SQL> select table_name, 'indexes', index_name from user_indexes where table_name in ('T1','T2')
2 union all
3 select table_name, 'constraints', constraint_name from user_constraints where table_name in ('T1','T2')
4 union all
5 select table_name, 'triggers', trigger_name from user_triggers where table_name in ('T1','T2');
TABLE_NAME 'INDEXES' INDEX_NAME
------------------------------ ----------- ------------------------------
T2 indexes TMP$$_T1_PK0
T1 indexes T1_PK
T1 constraints SYS_C005428
T1 constraints SYS_C005429
T1 constraints SYS_C005430
T1 constraints SYS_C005431
T1 constraints SYS_C005432
T1 constraints T1_PK
T1 constraints CHECK_GT_ZERO
T2 constraints TMP$$_CHECK_GT_ZERO0
T2 constraints TMP$$_SYS_C0054280
TABLE_NAME 'INDEXES' INDEX_NAME
------------------------------ ----------- ------------------------------
T2 constraints TMP$$_SYS_C0054290
T2 constraints TMP$$_SYS_C0054300
T2 constraints TMP$$_SYS_C0054310
T2 constraints TMP$$_SYS_C0054320
T2 constraints TMP$$_T1_PK0
T1 triggers T1_TRIGGER
T2 triggers TMP$$_T1_TRIGGER0
已选择18行。
SQL> exec dbms_redefinition.finish_redef_table( user, 'T1', 'T2' );
BEGIN dbms_redefinition.finish_redef_table( user, 'T1', 'T2' ); END;
*
第 1 行出现错误:
ORA-01031: 权限不足
ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 76
ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 1376
ORA-06512: 在 line 1
--用sys登陆执行 start-------------------------------------------
SQL> exec dbms_redefinition.finish_redef_table( 'TESTUSER', 'T1', 'T2' );
PL/SQL 过程已成功完成。
SQL>
--用sys登陆执行 end-------------------------------------------
SQL> select object_id, object_name from t1 NEW_TABLE where rownum<=5;
OBJECT_ID OBJECT_NAME
---------- ------------------------------
931 V$PGA_TARGET_ADVICE
943 V$DLM_MISC
955 V$DLM_RESS
957 V$HVMASTER_INFO
984 V_$BH
SQL> select object_id, object_name from t2 OLD_TABLE where rownum<=5;
OBJECT_ID OBJECT_NAME
---------- ------------------------------
28591 /7e59f4a3_SystemIdentity
27656 /c7e340d5_FontRenderContext
15623 /9be69f43_BasicSplitPaneUIFocu
37397 com/sun/mail/pop3/Status
7551 DBA_REPOBJECT
SQL> select 'indexes', index_name from user_indexes where table_name = 'T1'
2 union all
3 select 'constraints', constraint_name from user_constraints where table_name = 'T1'
4 union all
5 select 'triggers', trigger_name from user_triggers where table_name = 'T1';
'INDEXES' INDEX_NAME
----------- ------------------------------
indexes T1_PK
constraints CHECK_GT_ZERO
constraints SYS_C005428
constraints SYS_C005429
constraints SYS_C005430
constraints SYS_C005431
constraints SYS_C005432
constraints T1_PK
triggers T1_TRIGGER
已选择9行。
SQL> drop table t2;
表已删除。
SQL> SET LINESIZE 1000
SQL> SET FEEDBACK OFF
SQL> set long 999999
SQL> SET PAGESIZE 1000
SQL> select dbms_metadata.get_ddl( 'TABLE', 'T1' ) from dual;
DBMS_METADATA.GET_DDL('TABLE','T1')
--------------------------------------------------------------------------------
CREATE TABLE "TESTUSER"."T1"
( "OWNER" VARCHAR2(30) CONSTRAINT "SYS_C005428" NOT NULL ENABLE NOVALIDATE,
"OBJECT_NAME" VARCHAR2(30) CONSTRAINT "SYS_C005429" NOT NULL ENABLE NOVALIDATE,
"SUBOBJECT_NAME" VARCHAR2(30),
"OBJECT_ID" NUMBER CONSTRAINT "SYS_C005430" NOT NULL ENABLE NOVALIDATE,
"DATA_OBJECT_ID" NUMBER,
"OBJECT_TYPE" VARCHAR2(19),
"CREATED" DATE CONSTRAINT "SYS_C005431" NOT NULL ENABLE NOVALIDATE,
"LAST_DDL_TIME" DATE CONSTRAINT "SYS_C005432" NOT NULL ENABLE NOVALIDATE,
"TIMESTAMP" VARCHAR2(19),
"STATUS" VARCHAR2(7),
"TEMPORARY" VARCHAR2(1),
"GENERATED" VARCHAR2(1),
"SECONDARY" VARCHAR2(1),
"NAMESPACE" NUMBER,
"EDITION_NAME" VARCHAR2(30),
CONSTRAINT "CHECK_GT_ZERO" CHECK (object_id>0) ENABLE NOVALIDATE,
CONSTRAINT "T1_PK" PRIMARY KEY ("OBJECT_ID")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "TESTTBS" ENABLE NOVALIDATE
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
STORAGE(
BUFFER_POOL DEFAULT)
TABLESPACE "TESTTBS"
PARTITION BY HASH ("OBJECT_ID")
(PARTITION "SYS_P41"
TABLESPACE "TESTTBS",
PARTITION "SYS_P42"
TABLESPACE "TESTTBS",
PARTITION "SYS_P43"
TABLESPACE "TESTTBS",
PARTITION "SYS_P44"
TABLESPACE "TESTTBS",
PARTITION "SYS_P45"
TABLESPACE "TESTTBS",
PARTITION "SYS_P46"
TABLESPACE "TESTTBS",
PARTITION "SYS_P47"
TABLESPACE "TESTTBS",
PARTITION "SYS_P48"
TABLESPACE "TESTTBS")
SQL>
9I在线重定义测试
最新推荐文章于 2024-12-30 15:01:38 发布