oracle之varchar2修改为clob

背景

前面为解决oracle中varchar类型过长导致插入异常提示ORA-01461问题,采用了规避的方法,详见:ORA-01461:仅可以为插入 LONG 列的 LONG 值赋值

是在IP地址组表中,IP字段配置为varchar2(4000)类型,目前仅4000个字符,最后在使用过程中超过了大小限制。于是需要将其修改为clob类型(大小上限为4G)。

直接用alter修改

1
alter table FW_SRC_POOLS modify ip clob;

报错ORA-22858:数据类型的变更无效错误。

varchar2cloberror

解决方法

由于表中已经存在数据了,所以不能直接修改,需要采用新增临时列的方式进行:

  • 先将ip列名修改为ip_tmp

    1
    alter table FW_SRC_POOLS rename column ip to IP_TMP;
  • 新增ip列,类型为clob

    1
    alter table FW_SRC_POOLS add ip clob;
  • 将ip_tmp列的内容复制到ip列

    1
    update fw_src_pools set ip=trim(ip_tmp);
  • 删除ip_tmp列

    1
    alter table fw_src_pools drop column ip_tmp;

以上就完成了对已有表格中存在数据的varchar类型更换为clob类型的操作,当然也可以建一个临时表的方法,不过还是这样比较方便。

需要注意的是,数据库中字段类型变了,对应的java或者python的后台也需要修改。

比如python中使用cx_oracle库,在读取clob类型时,需要使用read()方法才行。

1
x = clob_param.read()