zoukankan      html  css  js  c++  java
  • 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)






  • 相关阅读:
    【转】二叉树中两个节点的最近的公共父节点
    查找最小的k个元素
    字符串的排列
    php字符串操作
    Android手机app启动的时候第一个Activity必须是MainActivity吗
    ASP.NET网站前端页面的复制
    MySQL字段类型说明
    转:Zend Server Community Edition(CE) 安装手记
    数据库远程导入导出步骤
    转:两种转换mysql数据编码的方法latin1转utf8
  • 原文地址:https://www.cnblogs.com/jianshuai520/p/9749730.html
Copyright © 2011-2022 走看看