这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战
曾经研发团队的小哥哥问:我们业务表里已经有数据了,想把表里字段的 varchar2 类型转成 clob 类型怎么操作?
我:为什么要转成 clob,能不用就别用。
小哥哥:varchar2 长度够用。
我:4000不够?
小哥哥: 院方要存一篇简介,就医院网站首页那种,长度超 4000 了。
我:等我整理下给你。
目标:
将表 test 中 name 字段的数据类型由 varchar2 转为 clob。
test 表环境:
SQL> desc test
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
NAME VARCHAR2(4000)
REMARK VARCHAR2(46)
SQL> select count(id) from test;
COUNT(ID)
----------
300000
备份数据:
数据泵导出 dmp 文件或在库中创建备份表。
SQL> create table test_20200805 as select * from test3;\
Table created.
开始转换:
方法一:替换字段
1)将要替换的字段name改为name_bak
SQL> alter table test rename column name to name_bak;
Table altered.
SQL> desc TEST
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
NAME_BAK VARCHAR2(4000)
REMARK VARCHAR2(46)
2)增加clob字段name
SQL> alter table test add name clob;
Table altered.
SQL> desc TEST
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
NAME_BAK VARCHAR2(4000)
REMARK VARCHAR2(46)
NAME CLOB
3) 更新数据至clob字段
SQL> update test set name=name_bak;\
300000 rows updated.\
Elapsed: 00:01:45.60
SQL> commit;\
Commit complete.\
Elapsed: 00:00:00.01
4) 删除原字段name_bak
SQL> alter table test drop column name_bak;\
Table altered.\
Elapsed: 00:00:42.58
5) 表结构,表数据验证
SQL> desc test
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
REMARK VARCHAR2(46)
NAME CLOB
SQL> select * from test;
ID REMARK NAME
---------- ---------------------------------------------- --------------------------------------------------------------------------------
38706 38706remark 38706name
38707 38707remark 38707name
38708 38708remark 38708name
38709 38709remark 38709name
38710 38710remark 38710name
38711 38711remark 38711name
38712 38712remark 38712name
38713 38713remark 38713name
38714 38714remark 38714name
38715 38715remark 38715name
38716 38716remark 38716name
38717 38717remark 38717name
38718 38718remark 38718name
38719 38719remark 38719name
38721 38721remark 38721name
38725 38725remark 38725name
38728 38728remark 38728name
38732 38732remark 38732name
38735 38735remark 38735name
38739 38739remark 38739name
.....................
.....................
方法二:替换表
1) 表test重命名为test_bak
SQL> rename test to test_bak;\
Table renamed.\
Elapsed: 00:00:00.21
2) 通过如下语句创建新表
SQL> create table test as select id,to_clob(name) name,remark from test_bak;\
Table created.\
Elapsed: 00:00:01.45
3)表结构,表数据验证
SQL> desc test
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
NAME CLOB
REMARK VARCHAR2(46)
SQL> select * from test where rownum<=100;
ID NAME REMARK
---------- -------------------------------------------------------------------------------- ----------------------------------------------
196304 196304name 196304remark
196305 196305name 196305remark
196306 196306name 196306remark
196307 196307name 196307remark
196308 196308name 196308remark
196309 196309name 196309remark
196310 196310name 196310remark
196311 196311name 196311remark
196312 196312name 196312remark
196313 196313name 196313remark
196314 196314name 196314remark
196315 196315name 196315remark
196316 196316name 196316remark
196317 196317name 196317remark
196318 196318name 196318remark
196319 196319name 196319remark
................
................