Thomas Zhang的杂货铺
20 01, 2007
在线重定义示例2:修改表字段顺序
作者 tomszrp 19:14 | Permalink 静态链接网址 | Comments 最新回复 (2) | Trackback 引用 (0) | 磨刀石

最近看到很多同志因为种种原因要调整字段的前后顺序,筒子们也各有各的招儿,常见的比如:重建、使用view、在线重定义等。

从Oracle 9i,Oracle推出了在线重定义的功能,在很大程度上帮助DBA完成很多修改而不影响应用。前面我示范了在线重定义修改普通表为分区表的一个很简单的demo,这个修改字段顺序,和那个例子在使用上基本一样。我就再罗嗦并重复一下吧,增加一点GDP吧,哈哈


SQL> create table toms_test (no int,name varchar2(32));

表已创建。

SQL> insert into toms_test values(1,'test string');

已创建 1 行。

SQL> commit;

提交完成。

SQL> desc toms_test
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
NO NUMBER(38)
NAME VARCHAR2(32)

SQL>


SQL> create table toms_test_mid (name varchar2(32),no int);

表已创建。

SQL> desc toms_test_mid;
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
NAME VARCHAR2(32)
NO NUMBER(38)

SQL> execute dbms_redefinition.can_redef_table('study','toms_test',dbms_redefinition.cons_use_rowid);

PL/SQL 过程已成功完成。

SQL> execute dbms_redefinition.start_redef_table('study','toms_test','toms_test_mid','no no,name name',dbms_redefinition.cons_use_rowid);

PL/SQL 过程已成功完成。

SQL> execute dbms_redefinition.finish_redef_table('study','toms_test','toms_test_mid');

PL/SQL 过程已成功完成。

SQL> desc toms_test
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
NAME VARCHAR2(32)
NO NUMBER(38)

SQL> select * from toms_test;

test string 1

SQL> alter table toms_test drop column "SYS_C00003_07012018:51:36$";
表已更改。

SQL>
SQL> desc toms_test;
名称 是否为空? 类型
----------------------------------------- -------- --------------------
NAME VARCHAR2(32)
NO NUMBER(38)

SQL>

Comments

基于ROWID的方式才会存在隐藏列,可以通过如下SQL得到:
select col#,name,type# from SYS.COL$
WHERE OBJ#=(select obj# from obj$ where owner#=(select user# from user$ where name='&owner') and
name='&table_name'
) and
col#=0;
比如,我上面的例子可以用这样的语句得到:
SQL> select obj#,col#,name from col$
2 where obj#=(select obj# from obj$ where owner#=(select user# from user$ where name='STUDY') and name='TOMS_TEST')
3 and col#=0;

OBJ# COL# NAME
---------- ---------- ------------------------------
54327 0 SYS_C00003_07012021:57:23$

SQL>

作者 Toms_zhang 20 01 2007, 22:06

alter table toms_test drop column "SYS_C00003_07012018:51:36$";
Toms,这个列从哪里查询得到?
表重定义了,原来的列数据怎么办,是不是也仅仅是加一个drop flag?

作者 fangjinde 20 01 2007, 21:03
博客日历
« 八月 2008 »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
搜索
最新发表
文章分类
文章归档
网站链接
新闻聚合