最具影响力的数字化技术在线社区

168大数据

 找回密码
 立即注册

QQ登录

只需一步,快速开始

1 2 3 4 5
开启左侧

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

[复制链接]
发表于 2015-5-28 11:05:39 | 显示全部楼层 |阅读模式

马上注册,结交更多数据大咖,获取更多知识干货,轻松玩转大数据

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
     本文通过两方面演示怎么将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函数,会将数据转换成和数据库字符集一致,就不会出现乱码的情况。

来自群组: Oracle DBA交流
楼主热帖
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

关于我们|小黑屋|Archiver|168大数据 ( 京ICP备14035423号|申请友情链接

GMT+8, 2024-3-29 08:38

Powered by BI168大数据社区

© 2012-2014 168大数据

快速回复 返回顶部 返回列表