Oracle批量修改字段类型varchar2(2000)转clob
Posted 李公子lm
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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区分
varchar2
和nvarchar2
。
DATA_LENGTH可以酌情修改。
新字段名是在旧字段名的基础上后面加个1。
改完,收工。
have a wonderful day.
以上是关于Oracle批量修改字段类型varchar2(2000)转clob的主要内容,如果未能解决你的问题,请参考以下文章
Oracle批量修改字段类型varchar2(2000)转clob