加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ORACLE 当字段中有数据如何修改字段类型

发布时间:2020-12-12 13:44:25 所属栏目:百科 来源:网络整理
导读:创建视图的时候,因为表太多,里面一些字段类型不一样,PL/SQL报错,为‘表达式必须具有对应表达式相同的数据类型’,发现后,一个字段的类型为CLOB和VARCHAR2(4000)两种,将CLOB进行修改 将CLOB字段修改成varchar2(4000)字段 ? 第一步:把原字段换个名字,

创建视图的时候,因为表太多,里面一些字段类型不一样,PL/SQL报错,为‘表达式必须具有对应表达式相同的数据类型’,发现后,一个字段的类型为CLOB和VARCHAR2(4000)两种,将CLOB进行修改

将CLOB字段修改成varchar2(4000)字段

?

第一步:把原字段换个名字,此条的sql是把C_009700010003换成C_0097000100031

alter table 表名 rename column? 当前字段 to 备用字段;

alter table T_00970001 rename column  C_009700010003 to C_0097000100031;

第二步:在表中添加一个原字段名字C_009700010003 ,并把类型定义自己想改变的类型, 此条是定义VARCHAR2类型

alter table 表名 add 新增字段名称 字段类型;

alter table T_00970001 add C_009700010003 VARCHAR2(4000);

第三步:养成良好的习惯,将字段名称进行备注,以免以后忘记字段名称。

comment on column T_00970001.C_009700010003 is 处罚事由;

第四步:这条语句是把备份的C_0097000100031字段内容 添加到新建字段C_009700010003 中来,这条语句就是把CLOB类型的数据转换成varchar2类型在插入到新定义的C_009700010003

update 表名 set 新增字段名称 = dbms_lob.substr(备用字段,4000);

update T_00970001 set C_009700010003 = dbms_lob.substr(C_0097000100031,4000);

第五步:把备份字段C_0097000100031去掉

alter table T_00970001 drop column C_0097000100031;

第四步的dbms_lob的用法,我整理了下:

我第四步中是截取前4000.

CLOB里存的是2进制

判定长度 ? DBMS_LOB.GETLENGTH(col1)
获取文本 ? DBMS_LOB.SUBSTR(col1,n,pos)
DBMS_LOB.SUBSTR(col1,10,1)表示从第1个字节开始取出10个字节

DBMS_LOB.SUBSTR(CLOB_VAR,32767)表示截取CLOB变量保存的全部数据

DBMS_LOB.FILECLOSE(IMG_BFILE)关闭文件

?

clob转化为字符串,SELECT ? UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(col1,1)) ? FROM ? tab1;

如果clob中包含空格则不能使用。

将clob类型转化成字符串

create?? or?? replace?? function?? getclob(
????????? table_name???????????? in?? varchar2,
????????? field_id?????????????? in?? varchar2,
????????? field_name???????????? in?? varchar2,
????????? v_id?????????????????? in?? number,
????????? v_pos????????????????? in?? number)?? return?? varchar2
is
????????? lobloc???????????????? clob;
????????? buffer???????????????? varchar2(32767);
????????? amount???????????????? number?? :=?? 2000;
????????? offset???????????????? number?? :=?? 1;
????????? query_str????????????? varchar2(1000);
begin
????? query_str?? := ‘select?? ‘||field_name|| ‘?? from?? ‘||table_name|| ‘?? where?? ‘||field_id|| ‘=?? :id?? ‘;
????? EXECUTE?? IMMEDIATE?? query_str?? INTO?? lobloc?? USING?? v_id;
????? offset:=offset+(v_pos-1)*2000;
????? dbms_lob.read(lobloc,amount,offset,buffer);
?????????????? return?? buffer;
exception
??????? when?? no_data_found?? then
?????????????? return?? buffer;
end;

?

?

?

当然了,还有一个更简单的方法。

那就是

先利用第三方工具软件PL/sql把数据导出来,而后修改数据结构,即修改数据类型,最后就重新往新的表插入数据。
alter table filename
modify 字段名 varchar2(4000)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读