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 旧字段名;

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

小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

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

接下来就可以把两个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 ;

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

改完,收工。

have a wonderful day.

猜你喜欢

转载自blog.csdn.net/u012869793/article/details/126447569