ORACLE 當字段中有數據如何修改字段類型


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







免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM