創建視圖的時候,因為表太多,里面一些字段類型不一樣,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,10,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)