• 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.

  • 相关阅读:
    目标跟踪实战deepsort+yolov5(上)
    安装node.js后进行的操作(配置node环境变量、npm镜像加速、安装vue-cli项目脚手架、在IDEA中打开并运行脚手架)
    C++ 重载运算符,语法+示例,非常详细!!!
    如何在Retail Link网站上与Walmart进行EDI连接测试?
    数字孪生创新计划
    基础IO(文件读取写入,重定向,缓冲区)
    排序:快速排序(C/C++)
    通俗易懂的ChatGPT的原理简介
    程序员如何学习开源项目,这篇文章告诉你
    DataTable扩展 列转行方法(2*2矩阵转换)
  • 原文地址:https://blog.csdn.net/u012869793/article/details/126447569