ORACLE怎样将CHAR类型字段转换成CLOB
May282015
本文通过两方面演示怎么将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函数,会将数据转换成和数据库字符集一致,就不会出现乱码的情况。
【上一篇】OGG-01193 Remote tasks cannot be used when other targets files or trails are specified.
【下一篇】OGG 12C图形化安装
【下一篇】OGG 12C图形化安装