--目标:
将表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 ................ ................ ................ |