情景

原来表中的列定义成VARCHAR2类型,众所周知,VARCHAR2类型最大支持长度为4000。假设因为业务须要。想把此列转换为CLOB类型,在Oracle中直接通过ALTER语句转换是行不通的。以下依据详细事例解说在Oracle数据库中怎样把表列由VARCHAR2类型转换为CLOB类型。

演示样例准备

1. 新建两张张表TB_WITHOUT_DATA(此VARCHAR2列不包括数据)和TB_WITH_DATA(此Varchar2列包括数据)

create table TB_WITHOUT_DATA
(
id NUMBER,
name VARCHAR2(100),
description VARCHAR2(2000)
);
create table TB_WITH_DATA
(
id NUMBER,
name VARCHAR2(100),
description VARCHAR2(2000)
); insert into TB_WITH_DATA VALUES (1,'David Louis','He is capable of resolving such kind of issue');
insert into TB_WITH_DATA VALUES (2,'German Noemi','She is very beatiful and charming');
insert into TB_WITH_DATA VALUES (3,'Oliver Queen','He is main actor in the Green Arrow');
insert into TB_WITH_DATA VALUES (4,'Mark Williams','He plays snooker very well');
insert into TB_WITH_DATA VALUES (5,'Sita Rama Raju Kata','I do not know this guy');
insert into TB_WITH_DATA VALUES (6,'Promethus','This is a very nice movie');
commit;

错误方法

ALTER TABLE TB_WITHOUT_DATA MODIFY description clob;

错误信息:

SQL Error: ORA-22858: invalid alteration of datatype

22858. 00000 -  "invalid alteration of datatype"

*Cause:    An attempt was made to modify the column type to object, REF,

           nested table, VARRAY or LOB type.

*Action:   Create a new column of the desired type and copy the current

           column data to the new type using the appropriate type

           constructor.

解决方法

方法一:对于此列没有数据的可通过下面方法改动-首先把该列改成Long类型,然后再改成clob类型

alter table TB_WITHOUT_DATA modify description long;--首先改成Long类型
alter table TB_WITHOUT_DATA modify description clob;--在Long类型的基础上改成clob类型

注:对于此列已经存在数据的。不能通过此方法。否则会报例如以下错误:

alter table TB_WITH_DATA modify description long;--更改包括数据的列
SQL Error: ORA-01439: column to be modified must be empty to change datatype
01439. 00000 - "column to be modified must be empty to change datatype"

方法二:此方法适合此列包括数据和此列不包括数据两种情况

步骤一:把原来表中该列重命名

alter table TB_WITHOUT_DATA rename column description to description_bak;
alter table TB_WITH_DATA rename column description to description_bak;

步骤二:在表中添加该列,并指定改列类型为clob

alter table TB_WITHOUT_DATA add description clob;
alter table TB_WITH_DATA add description clob;

步骤三:对此列包括数据的须要包数据从步骤一重命名列中拷出(对于此列没有数据的此步骤省略)

update TB_WITH_DATA set description=description_bak;
commit;

步骤四:删除步骤一中的备份列

alter table TB_WITHOUT_DATA drop column description_bak;
alter table TB_WITH_DATA drop column description_bak;

步骤五:验证

1) 表结构验证

DESC TB_WITHOUT_DATA
Name Null Type
----------- ---- -------------
ID NUMBER
NAME VARCHAR2(100)
DESCRIPTION CLOB
DESC TB_WITH_DATA
Name Null Type
----------- ---- -------------
ID NUMBER
NAME VARCHAR2(100)
DESCRIPTION CLOB

2) 数据验证

select * from TB_WITH_DATA;

        ID NAME                       DESCRIPTION
---------- -------------------------- ------------------------------------------------
1 David Louis He is capable of resolving such kind of issue
2 German Noemi She is very beatiful and charming
3 Oliver Queen He is main actor in the Green Arrow
4 Mark Williams He plays snooker very well
5 Sita Rama Raju Kata I do not know this guy
6 Promethus This is a very nice movie 6 rows selected

方法三:此方法适合此列包括数据和此列不包括数据两种情况

在解说方法三之前,须要包表恢复到准备阶段,因为时间关系,直接通过drop然后re-create方法,脚本例如以下:

drop table TB_WITHOUT_DATA;
drop table TB_WITH_DATA; create table TB_WITHOUT_DATA
(
id NUMBER,
name VARCHAR2(100),
description VARCHAR2(2000)
); create table TB_WITH_DATA
(
id NUMBER,
name VARCHAR2(100),
description VARCHAR2(2000)
); insert into TB_WITH_DATA VALUES (1,'David Louis','He is capable of resolving such kind of issue');
insert into TB_WITH_DATA VALUES (2,'German Noemi','She is very beatiful and charming');
insert into TB_WITH_DATA VALUES (3,'Oliver Queen','He is main actor in the Green Arrow');
insert into TB_WITH_DATA VALUES (4,'Mark Williams','He plays snooker very well');
insert into TB_WITH_DATA VALUES (5,'Sita Rama Raju Kata','I do not know this guy');
insert into TB_WITH_DATA VALUES (6,'Promethus','This is a very nice movie');
commit;

步骤一:重命名两张表

rename TB_WITHOUT_DATA to TB_WITHOUT_DATA_BAK;
rename TB_WITH_DATA to TB_WITH_DATA_BAK;

步骤二:创建两张新表(通过下面语句创建两张表)

create table TB_WITHOUT_DATA
as
select id, name, to_clob(description) description
from TB_WITHOUT_DATA_BAK; create table TB_WITH_DATA
as
select id, name, to_clob(description) description
from TB_WITH_DATA_BAK;

表结构与数据验证:

desc TB_WITHOUT_DATA
Name Null Type
----------- ---- -------------
ID NUMBER
NAME VARCHAR2(100)
DESCRIPTION CLOB desc TB_WITH_DATA
Name Null Type
----------- ---- -------------
ID NUMBER
NAME VARCHAR2(100)
DESCRIPTION CLOB select * from TB_WITH_DATA; select * from TB_WITH_DATA; ID NAME DESCRIPTION
---------- -------------------------- ------------------------------------------------
1 David Louis He is capable of resolving such kind of issue
2 German Noemi She is very beatiful and charming
3 Oliver Queen He is main actor in the Green Arrow
4 Mark Williams He plays snooker very well
5 Sita Rama Raju Kata I do not know this guy
6 Promethus This is a very nice movie 6 rows selected

步骤三:删除备份表:

DROP TABLE TB_WITHOUT_DATA_BAK;
DROP TABLE TB_WITH_DATA_BAK;

-----------------------------------------------------------------------------------------------------------------------------------------------------------

假设您们在尝试的过程中遇到什么问题或者我的代码有错误的地方。请给予指正。很感谢!

联系方式:david.louis.tian@outlook.com

版权@:转载请标明出处。

Oracle中表列由VARCHAR2类型改成CLOB的更多相关文章

  1. 将varchar2类型字段改成clob类型

     --增加临时新字段alter table base_temp add temp clob; --将需要改成大字段的项内容copy到大字段中update base_temp  set temp=con ...

  2. python将字符串类型改成日期类型

    将字符串类型的'2019-03-14'改成date类型,如下: import datetime b = datetime.date(*map(int,'2019-03-14'.split('-'))) ...

  3. ORACLE varchar2类型的字段更改为clob

    将varchar2类型字段改成clob类型    --增加临时新字段 alter table base_temp add temp clob; --将需要改成大字段的项内容copy到大字段中updat ...

  4. oracle中char],varchar,varchar2

    VARCHAR.VARCHAR2.CHAR的区别 1.CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串"abc",对于CHAR (20),表示你存储 ...

  5. Oracle一列的多行数据拼成一行显示字符

    Oracle一列的多行数据拼成一行显示字符   oracle 提供了两个函数WMSYS.WM_CONCAT 和 ListAgg函数.    www.2cto.com   先介绍:WMSYS.WM_CO ...

  6. Oracle定义varchar2()类型存储汉字的长度问题

    varchar2最大是4000字节,那么就看你的oracle字符集:(select userenv('language') from dual;)如果字符集是16位编码的,ZHS16GBK,那么每个字 ...

  7. long类型字段转换成varchar2类型

    參考文档: How to Convert a Long to Varchar2 (文档 ID 228532.1) /*long类型字段转换成varchar2类型*/ --建表 create table ...

  8. Spark 将DataFrame所有的列类型改为double

    Spark 将DataFrame所有的列类型改为double 1.单列转化方法 2.循环转变 3.通过:_* 1.单列转化方法 import org.apache.spark.sql.types._ ...

  9. oracle中修改表已有数据的某一列的字段类型的方法,数据备份

    1.在开发过程中经常会遇到表中的某一个字段数据类型不对,比如说需要保存的数据带小数,但是在最初设计的时候是给的number(10)类型,开始保存是整数的时候满足要求,后来在保存小数的时候 会发现自动四 ...

随机推荐

  1. USACO 5.5 Picture

    PictureIOI 1998 A number, N (1 <= N < 5000), of rectangular posters, photographs and other pic ...

  2. Loadrunner参数化逗号报错解决方法

    Loadrunner参数化逗号报错解决方法     介绍Loadrunner参数化时,参数中包含有逗号时出错的解决方法. 在Loadrunner进行参数化时,参数中如果含有逗号,编辑保存后会报错: 此 ...

  3. bzoj 1202: [HNOI2005]狡猾的商人

    我居然用暴力跑过去了... 思路:两个区间合成一个新的区间才会产生冲突, 我们用并查集维护前缀和, 0 - n 个节点分别表示sum[ 0 ] - sum[ n ], d[ i ] 表示 前缀i 和它 ...

  4. idea 设置svn忽略 .idea内的文件

    从ToolView中打开 Version Control  -> Local Changes  中的Default ChangesList里面的文件全选中右键选择 Move to  Anothe ...

  5. 设置 cookie过期时间

    cookie.setMaxAge(0);//不记录cookie cookie.setMaxAge(-1);//会话级cookie,关闭浏览器失效 cookie.setMaxAge(60*60);//过 ...

  6. Java中面向对象的理解

    按照惯例,先做一个简单的介绍,现在开始学习 Thinging in Java 4 ,一边看,一边记录,我都不想给自己设定时间安排了,毕竟很少实现过.所以就这样吧!不定期的更新,我都会放到博客中的. 所 ...

  7. 特殊字符导致jquery-mobile 挂起(firefox控制台报错 malformed URI sequence)

    同事遇到一个问题,刷新页面导致页面挂起,浏览器控制台报错 malformed URI sequence, 经排查发现是引用jquery-mobile js引起的问题, 有一些中文参数在url中,当页面 ...

  8. NandFlash_control

    驱动:编写任何设备的驱动程序,都需要对该设备的原理有一定了解和认识.对于外部设备的访问总是需要通过一个控制器来间接访问,对于这个控制器的控制程序称为驱动程序 Nandflash 原理: 一:角色分析 ...

  9. Educational Codeforces Round 13 C. Joty and Chocolate 水题

    C. Joty and Chocolate 题目连接: http://www.codeforces.com/contest/678/problem/C Description Little Joty ...

  10. Codeforces Round #356 (Div. 2) D. Bear and Tower of Cubes dfs

    D. Bear and Tower of Cubes 题目连接: http://www.codeforces.com/contest/680/problem/D Description Limak i ...