时间:2021-07-01 10:21:17 帮助过:18人阅读
原来表中的列定义成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.
- 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
2) 数据验证
- 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
- 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
标签:备份 action snippet play rac 步骤 drop empty 不能