Oracle中表列由VARCHAR2类型改成CLOB
情景
原来表中的列定义成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的更多相关文章
- 将varchar2类型字段改成clob类型
--增加临时新字段alter table base_temp add temp clob; --将需要改成大字段的项内容copy到大字段中update base_temp set temp=con ...
- python将字符串类型改成日期类型
将字符串类型的'2019-03-14'改成date类型,如下: import datetime b = datetime.date(*map(int,'2019-03-14'.split('-'))) ...
- ORACLE varchar2类型的字段更改为clob
将varchar2类型字段改成clob类型 --增加临时新字段 alter table base_temp add temp clob; --将需要改成大字段的项内容copy到大字段中updat ...
- oracle中char],varchar,varchar2
VARCHAR.VARCHAR2.CHAR的区别 1.CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串"abc",对于CHAR (20),表示你存储 ...
- Oracle一列的多行数据拼成一行显示字符
Oracle一列的多行数据拼成一行显示字符 oracle 提供了两个函数WMSYS.WM_CONCAT 和 ListAgg函数. www.2cto.com 先介绍:WMSYS.WM_CO ...
- Oracle定义varchar2()类型存储汉字的长度问题
varchar2最大是4000字节,那么就看你的oracle字符集:(select userenv('language') from dual;)如果字符集是16位编码的,ZHS16GBK,那么每个字 ...
- long类型字段转换成varchar2类型
參考文档: How to Convert a Long to Varchar2 (文档 ID 228532.1) /*long类型字段转换成varchar2类型*/ --建表 create table ...
- Spark 将DataFrame所有的列类型改为double
Spark 将DataFrame所有的列类型改为double 1.单列转化方法 2.循环转变 3.通过:_* 1.单列转化方法 import org.apache.spark.sql.types._ ...
- oracle中修改表已有数据的某一列的字段类型的方法,数据备份
1.在开发过程中经常会遇到表中的某一个字段数据类型不对,比如说需要保存的数据带小数,但是在最初设计的时候是给的number(10)类型,开始保存是整数的时候满足要求,后来在保存小数的时候 会发现自动四 ...
随机推荐
- jenkins中管理用户
jenkins中管理用户: 管理用户权限
- Python下opencv使用笔记(图像的平滑与滤波)
对于图形的平滑与滤波,但从滤波角度来讲,一般主要的目的都是为了实现对图像噪声的消除,增强图像的效果. 对于2D图像可以进行低通或者高通滤波操作 低通滤波(LPF):有利于去噪,模糊图像 高通滤波(HP ...
- HP电脑的增霸卡功能操作详解
机房管理中HP电脑的增霸卡功能操作详解 一.软件去除保护 1).电脑开机后等待进入增霸卡选择系统界面: 2).按F1帮助,F10进入增霸卡BIOS界面: 3).光标切换到>>>系统还 ...
- poi类包对比
- Kolla O版本部署
Kolla O版部署和之前的版本还是有些区别的,环境还是all-in-one 基本准备: 关闭Selina和firewalld [root@kolla ~]# cat /etc/redhat-rele ...
- [ 转载 ] Centos 安装mysql后启动失败 出现 ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’
MySQL Daemon failed to start Mysql出问题一定要学会查看log https://blog.csdn.net/shuai825644975/article/details ...
- Centos7(Firewall)防火墙开启常见端口命令
使用云服务器的,一定要注意开启安全组配置的响应端口 Centos7默认安装了firewalld,如果没有安装的话,则需要YUM命令安装:firewalld真的用不习惯,与之前的iptable防火墙区别 ...
- Java并发(十九):final实现原理
final在Java中是一个保留的关键字,可以声明成员变量.方法.类以及本地变量. 一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再次初始化的话,编译器会报编 ...
- Problem F: 铺地砖
Description 元旦过去了,新年大酬宾活动也已经告一段落了.陈盖历望着堆在仓库的瓷砖,很无聊的他把这些瓷砖裁成很多1X1 1X2 1X3的小瓷砖,然后他把这些小瓷砖排在地上画的一个1*n的长方 ...
- mysql关联查询和联合查询
一.内联方式 1.传统关联查询 "select * from students,transcript where students.sid=transcript.sid and transc ...