ORACLE怎样将CHAR类型字段转换成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/,通过两方面演示怎么将ORACLE数据库中的CHAR类型的字段转换成CLOB类型的字段,一种情况是空列,另一种情况是列中已有数据。测试表结构如下:

1 SQL> desc sdb_b2c_goods
2 Name                                      Null?    Type
3 ----------------------------------------- -------- ----------------------------
4 GOODS_ID                                  NOT NULL NUMBER(38)
5 INTRO                                     VARCHAR2(4000 CHAR)
6 ASK                                       VARCHAR2(4000 CHAR)
7 INTRO_DES                                 VARCHAR2(4000 CHAR)
8 INTRO_DES_TXT                             VARCHAR2(4000 CHAR)
9 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函数,会将数据转换成和数据库字符集一致,就不会出现乱码的情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值