发表于: 2008.08.02 23:25
分类: ORACLE , Bug
出处: http://yangtingkun.itpub.net/post/468/467999
---------------------------------------------------------------
Oracle在9i增加了表压缩的功能,但是9i中表压缩之后无法添加新的字段。
看一个简单的例子:
SQL> CREATE TABLE T_COMPRESS (ID NUMBER, NAME VARCHAR2(30)) COMPRESS;
表已创建。
SQL> ALTER TABLE T_COMPRESS ADD AGE NUMBER;
ALTER TABLE T_COMPRESS ADD AGE NUMBER
*第 1 行出现错误:
ORA-22856: 无法在对象表中添加列
SQL> SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production PL/SQL Release 9.2.0.4.0 - Production
CORE 9.2.0.3.0 Production
TNS for 32-bit Windows: Version 9.2.0.4.0 - Production
NLSRTL Version 9.2.0.4.0 - Production
而同样的问题在10g中已经被解决:
SQL> CONN YANGTK/YANGTK@YTK102已连接。
SQL> CREATE TABLE T_COMPRESS (ID NUMBER, NAME VARCHAR2(30)) COMPRESS;
表已创建。
SQL> ALTER TABLE T_COMPRESS ADD AGE NUMBER;
表已更改。
SQL> SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
ORACLE在metalink文档Doc ID: Note:281472.1中对这个bug进行了描述,对于9205及以下版本的Oracle不但没有办法添加列,就是删除列也会报错
SQL> CONN YANGTK/YANGTK@YTK92已连接。
SQL> ALTER TABLE T_COMPRESS DROP COLUMN NAME;
ALTER TABLE T_COMPRESS DROP COLUMN NAME
*第 1 行出现错误:
ORA-12996: 无法删除系统生成的虚拟列
解决方法是通过MOVE,将存储参数设置为NOCOMPRESS,然后就可以执行添加、删除列的操作了。
SQL> ALTER TABLE T_COMPRESS MOVE NOCOMPRESS;
表已更改。
SQL> ALTER TABLE T_COMPRESS ADD AGE NUMBER;
表已更改。
SQL> ALTER TABLE T_COMPRESS DROP COLUMN NAME;
表已更改。
可见,对于9i新增的压缩功能,在10g以前仍然存在比较多问题。











