最近突然遇到好多Oracle 列由VARCHAR2改为CLOB类型的需求,不知道大家是不是约好了。。。查了一些网上的文章,结合实际修改的情况记录一下各种场景及解决方法。

一、 示例准备

新建两张表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 currentcolumn data to the new type using the appropriate typeconstructor.

二、 解决方法

1. 待修改列无数据

  • 列上无约束

首先把该列改成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"
  • 列上有约束

如果列上有约束改为long类型也会报错

解决方法:

1)删除约束后再改,改完再建约束。

2)既然都是空的,drop掉这列直接加个clob类型列就好了,记得把约束建回去(建议先建测试表试下导入数据是否有问题)

2. 待修改列包含数据

注意此方法需要停业务,不然新数据会丢。当然不包含数据也可以用这种,但没必要。

1)重命名原列

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

2)新建clob列

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

3)将原列中数据更新到clob列

update TB_WITH_DATA set description=description_bak;
commit;

4)删除原列

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

5)验证

表结构验证

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;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                       

3. 待修改列包含数据,另一种方法

注意此方法需要停业务,不然新数据会丢。当然不包含数据也可以用这种,但没必要。

1)重命名业务表

alter table TB_WITH_DATA rename to TB_WITH_DATA_BAK;

2)通过以下语句创建新表

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

表结构与数据验证

desc TB_WITH_DATA
Name        Null Type
----------- ---- -------------
ID               NUMBER
NAME             VARCHAR2(100)
DESCRIPTION      CLOB 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      

3)删除备份表

DROP TABLE TB_WITH_DATA_BAK;

参考

https://blog.csdn.net/jssg_tzw/article/details/40829867

Oracle 列由VARCHAR2改为CLOB类型相关推荐

  1. oracle将把varchar2字段(长度4000)改为clob类型

    把表DT_CORP_ENTERPRISE中ASSetsinvestmen字段(varchar2,长度为4000)改为clob类型 --增加大字段项 alter table DT_CORP_ENTERP ...

  2. oracle将其他字段类型改为clob类型方法

    oracle将其他字段类型改为clob类型方法 FIELD_INSTANCE 表名 FIELD_STRING_VALUE 字段名 第一步:添加一个clob类型的字段 alter table FIELD ...

  3. oracle修改clob值,oracle修改字段类型由varchar2修改为clob类型

    模拟情景,表:batchintfloadlog,要修改字段:resultinfo,字段 从原来的 varchar2 修改为 clob 1.假设要修改字段数值为空,则可以直接修改:​ 可是发现如下错误: ...

  4. varchar2改为clob带来的问题

    为什么80%的码农都做不了架构师?>>>    jdbc的PreparedStatement.setString(),ResultSet.getString()对clob和strin ...

  5. Oracle中表列由VARCHAR2类型改成CLOB

    情景 原来表中的列定义成VARCHAR2类型,众所周知,VARCHAR2类型最大支持长度为4000.如果由于业务需要,想把此列转换为CLOB类型,在Oracle中直接通过ALTER语句转换是行不通的. ...

  6. oracle 数据类型的变更无效 clob,ORA-22858:数据类型的变更无效varchar2类型转换为clob类型...

    oracle中,如果一个列的类型为varchar2,那么它不能直接转换为clob类型.可以通过间接的方式来修改.下面为实验: Oracle中,如果一个列的类型为varchar2,那么它不能直接转换为c ...

  7. oracle数据的变更无效,ORA-22858:数据类型的变更无效varchar2类型转换为clob类型

    oracle中,如果一个列的类型为varchar2,那么它不能直接转换为clob类型.可以通过间接的方式来修改.下面为实验: Oracle中,如果一个列的类型为varchar2,那么它不能直接转换为c ...

  8. oracle 数据类型的变更无效 clob,ORA-22858数据类型的变更无效 varchar2类型转换为clob类型...

    ORA-22858: 数据类型的变更无效 varchar2类型转换为clob类型 Oracle中,如果一个列的类型为varchar2,那么它不能直接转换为clob类型.可以通过间接的方式来修改.下面为 ...

  9. oracle的clob类型数据,Oracle的CLOB类型数据处理

    Oracle菜鸟之grant授权: http://www.2cto.com/database/201408/322396.html oracle 查看用户所在的表空间 : http://www.voi ...

最新文章

  1. Git 远程操作详解
  2. 熊市利好,Bit-Z推出币圈最高返佣50%
  3. linux3.0-内核自带led驱动移植
  4. 三星显示、LG已开始为苹果iPhone 13生产OLED屏幕
  5. android wifi是否可用,Android检测网络连接是否可用
  6. 扩展progress_timer的计时精度
  7. python模拟按键_Python实现windows下模拟按键和鼠标点击的方法
  8. matlab anova 如何不画图,方差分析的数据处理和作图
  9. mybatis字符串模糊匹配
  10. 0039-如何使用Python Impyla客户端连接Hive和Impala
  11. [转载]MyISAM InnoDB 区别
  12. 电视盒子为啥不安装鸿蒙,电视盒子视频播放不了怎么办?只需三步轻松解决!...
  13. Win10 远程桌面登陆闪退问题处理
  14. 服务器挂载本地iso文件系统,CentOS系统中挂载光盘镜像ISO文件的教程
  15. 今天开机发现,在光标左边多了一个长方形的带有箭头的,怎么去掉?
  16. 目标定位和检测系列中IOU的含义
  17. 使用 Play Integrity API 来保护您的应用和游戏
  18. HFSS仿真笔记1《A Low-Profile Ultrawideband Slotted Dipole Antenna Based on Artificial Magnetic Conductor》
  19. NBTSCAN的使用,查找arp病毒工具。
  20. SQL 2012 更换数据库路径

热门文章

  1. 前端js获取系统更新刷新页面
  2. Arduino IDE安装UNO和NANO开发板驱动教程(CH341SER.EXE)
  3. 电脑如何设置定时任务,定时执行
  4. Python | Python 使用xlwt模块操作Excel(持续更新)
  5. 查看电脑ip,关闭电脑,远程重启关闭等电脑命令大全
  6. 关于计算机等级考试的资源网,计算机等级考试计算机网络题库
  7. 在北京安定门零售店拿下绿源卡乐03,让我随时出发“找自由”
  8. 舆情分析流程及具体做法
  9. android 设置字体包 字体包导致字体偏移 字体内边距问题(已解决)
  10. 树莓派魔镜项目——笔记一 项目介绍和内容链接