当前位置: 首页 > Oracle, oracle 10g, oracle 11g > 正文

ORACLE怎样将CHAR类型字段转换成CLOB

本文通过两方面演示怎么将ORACLE数据库中的CHAR类型的字段转换成CLOB类型的字段,一种情况是空列,另一种情况是列中已有数据。测试表结构如下:

SQL> desc sdb_b2c_goods
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 GOODS_ID                                  NOT NULL NUMBER(38)
 INTRO                                              VARCHAR2(4000 CHAR)
 ASK                                                VARCHAR2(4000 CHAR)
 INTRO_DES                                          VARCHAR2(4000 CHAR)
 INTRO_DES_TXT                                      VARCHAR2(4000 CHAR)
 INTRO_BRAND                                        VARCHAR2(4000 CHAR)

列中无数据:

列中无数据的情况下,修改字段类型相对简单,直接使用modify语句即可修改,但并不能直接将CHAR类型修改成CLOB类型,否则会遇到ORA-22858错误。

SQL> alter table sdb_b2c_goods modify(intro clob);
alter table sdb_b2c_goods modify(intro clob)
                                 *
ERROR at line 1:
ORA-22858: invalid alteration of datatype

空列的情况下,需要先将CHAR类型修改成LONG类型,然后在将LONG类型修改成CLOB。

SQL> alter table sdb_b2c_goods modify(intro long);

Table altered.

SQL> alter table sdb_b2c_goods modify(intro clob);

Table altered.

列中有数据:

列中已经有数据的情况下,修改字段类型比较麻烦,直接修改会遇到ORA-01439错误。

SQL> alter table sdb_b2c_goods modify (ask long);
alter table sdb_b2c_goods modify (ask long)
                                  *
ERROR at line 1:
ORA-01439: column to be modified must be empty to change datatype

如果要修改的列已经存在数据,在11g之前大多都是使用以下方法实现。

1.新增CLOB列

SQL> alter table sdb_b2c_goods add ask1 clob;

Table altered.

2.将要修改列的数据修改到新增的CLOB列

SQL> update sdb_b2c_goods set ask1=ask;

1 row updated.

SQL> commit;

Commit complete.

SQL> select ask,ask1 from sdb_b2c_goods;

ASK				ASK1
--------------		--------------
aaaaaaa			aaaaaaa

3.删除要修改的列

SQL>  alter table sdb_b2c_goods drop column ask;

Table altered.

4.将新增的列重命名为原要修改列的名称

SQL> alter table sdb_b2c_goods rename column ask1 to ask;

Table altered.

也可以使用TO_CLOB来将CHAR类型的字段修改为CLOB。

SQL> select INTRO_DES from sdb_b2c_goods;

INTRO_DES
------------
bbbbbb

SQL> alter table sdb_b2c_goods add INTRO_DES2 clob;

Table altered.

SQL> update sdb_b2c_goods set INTRO_DES2=to_clob(INTRO_DES);

1 row updated.

SQL> commit;

Commit complete.

SQL> select INTRO_DES,INTRO_DES2 from sdb_b2c_goods;

INTRO_DES			INTRO_DES2
----------			----------
bbbbbb				bbbbbb

SQL> alter table sdb_b2c_goods drop column INTRO_DES;

Table altered.

SQL> alter table sdb_b2c_goods rename column INTRO_DES2 to INTRO_DES;

Table altered.

虽然看起来,加不加TO_CLOB函数基本没什么区别,可是TO_CLOB函数会根据数据库字符集进行转换,在客户端和数据库字符集不一致的情况下,不加TO_CLOB函数可能新增列的数据会乱码,加了TO_CLOB函数,会将数据转换成和数据库字符集一致,就不会出现乱码的情况。

本文固定链接: http://www.dbdream.com.cn/2015/05/oracle%e6%80%8e%e6%a0%b7%e5%b0%86char%e7%b1%bb%e5%9e%8b%e5%ad%97%e6%ae%b5%e8%bd%ac%e6%8d%a2%e6%88%90clob/ | 信春哥,系统稳,闭眼上线不回滚!

该日志由 dbdream 于2015年05月28日发表在 Oracle, oracle 10g, oracle 11g 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: ORACLE怎样将CHAR类型字段转换成CLOB | 信春哥,系统稳,闭眼上线不回滚!
关键字: , , ,

ORACLE怎样将CHAR类型字段转换成CLOB:等您坐沙发呢!

发表评论

快捷键:Ctrl+Enter