• Oracle批量修改字段类型varchar2(2000)转clob


    背景

    平时用的数据库主要是SqlServer,但是在不同的项目上,可能会用到不同的数据库,所以在字段类型转换上就遇到了一些小问题,记录一下。

    正文

    在SqlServer中,为了保存大文本内容,通常会使用nvarchar(max)或者Text类型,都最多可以支持最大2GB的内容存储,但是对于nvarchar(max)来说,如果存储的内容长度小于8000个字节(4000个双字节字符),该类型实际是被当做varchar类型来处理的。

    有时候在生成一些脚本时,SqlServer中的nvarchar(max)会被转换成oracle中的nvarchar2(2000),如果数据库已经在被使用了,这时候只能动态的修改字段类型了。如果字段不多的话,使用如下的脚本即可。

    --增加临时新字段
    ALTER  table 表名 ADD 新字段名 clob;
    --复制内容
    Update 表名  Set 新字段名 = 旧字段名;
    --删除原有字段
    ALTER table 表名  drop column 旧字段名;
    --修改回原字段名
    ALTER  table 表名  rename column 新字段名 to 旧字段名;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    基本思想就是添加一个新字段,把旧字段中的值赋值给新字段,把旧字段删除,把新字段名修改为旧字段。

    小tips:如果表名或者字段名不是全大写,则需要添加双引号,例如"User"

    如果字段比较多,上面的脚本可能就很长了,这个时候可以考虑采用循环来解决问题了。

    首先需要查询指定用户下所有的表名,字段名,字段类型,字段长度,语句如下。

    select TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH  from all_tab_columns  where OWNER = 'C##STUDENT'
    AND  DATA_TYPE='VARCHAR2' AND DATA_LENGTH=2000
    
    • 1
    • 2

    查询结果如下,仅做示例。
    在这里插入图片描述

    接下来就可以把两个sql语句结合起来了,完整脚本如下。

    begin
              for r in (select TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH  from all_tab_columns  where OWNER = 'C##STUDENT'
    AND  DATA_TYPE='VARCHAR2' AND DATA_LENGTH=4000) LOOP
               --增加临时新字段
               execute immediate 'ALTER  table "'|| r.TABLE_NAME ||'"  ADD "'|| r.COLUMN_NAME ||'1" clob';
              --复制内容
               execute immediate 'Update "'|| r.TABLE_NAME ||'"  Set "'|| r.COLUMN_NAME ||'1" = "'|| r.COLUMN_NAME ||'"';
              --删除原有字段
    		   execute immediate 'ALTER table "'|| r.TABLE_NAME ||'"  drop column "'|| r.COLUMN_NAME ||'"';
    		   --修改回原字段名
               execute immediate 'ALTER  table "'|| r.TABLE_NAME ||'"  rename column "'|| r.COLUMN_NAME ||'1" to "'|| r.COLUMN_NAME ||'" ';
               end loop;
      end ;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    DATA_TYPE区分varchar2nvarchar2
    DATA_LENGTH可以酌情修改。
    新字段名是在旧字段名的基础上后面加个1。

    改完,收工。

    have a wonderful day.

  • 相关阅读:
    剑指Offer || 035.最小时间差
    Spring 源码(14)Spring Bean 的创建过程(5)
    SpringCloud学习(三)——Ribbon负载均衡
    CoM-Px30|RK3358核心模块串口通信测试
    SVM 用于将数据分类为两分类或多分类(Matlab代码实现)
    不是跨域访问权限_而是后台代码错误_错误一点点排
    (蓝桥杯C/C++)——常用库函数
    机器人过程自动化(RPA)入门 4. 数据处理
    【LeetCode刷题笔记】二叉树(三)
    Hive数据定义语言-DDL-入门基础(含四个实践案例)
  • 原文地址:https://blog.csdn.net/u012869793/article/details/126447569