ORACLE数据库不能直接变更CLOB字段类型为varchar,把字段清空也不行。
如下表:
SQL> desc TABLE
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NOT NULL NUMBER(20)
TRANS_IDO VARCHAR2(40)
ORDER_ID VARCHAR2(20)
SRC_XML CLOB
TARGET_XML CLOB
STATE VARCHAR2(10)
REMARK VARCHAR2(1000)
RTN_CODE NOT NULL VARCHAR2(10)
RTN_MSG VARCHAR2(2000)
PROCESS_TIME DATE
COST_CRM NUMBER(11)
COST_TRANS NUMBER(11)
COST_IOM NUMBER(11)
ACCEPT_MONTH NOT NULL NUMBER(2)
MESSAGE_BODY VARCHAR2(1000)
变更SRC_XML字段类型为varchar
SQL> alter table TABLE modify SRC_XML varchar2(4000);
alter table TABLE modify SRC_XML varchar2(4000)
*
ERROR at line 1:
ORA-22859: invalid modification of columns
要达到目的,可以添加一个临时字段
alter table TABLE add SRC varchar2(4000);
把SRC_XML 字段的值插入临时字段
update TABLE set SRC=SRC_XML;
新建临时表,用临时字段替换原CLOB字段的位置
create table TABLE_TMP as select ID,TRANS_IDO,ORDER_ID,SRC,TARGET_XML,STATE,REMARK,RTN_CODE,RTN_MSG,PROCESS_TIME,COST_CRM,COST_TRANS,COST_IOM,ACCEPT_MONTH,MESSAGE_BODY from TABLE;
更改临时字段名为原CLOB字段名
alter table TABLE_TMP rename column SRC to SRC_XML;
改名备份原表,把临时表名改为原表名。注意临时表是没有索引的,改名前最好按照原表建索引
alter table TABLE rename to TABLE_DEL;
alter table TABLE_TMP rename to TABLE;
这样,就把字段SRC_XML从CLOB字段变更为varchar字段,且保持字段顺序不变。