【原】Oracle 如何修改列的数据类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【原】Oracle 如何修改列的数据类型相关的知识,希望对你有一定的参考价值。

alter table xxx modify yyy varchar2(2);
其中,xxx 为表名,yyy为列名,最后为要改成的数据类型。
希望可以帮到你
参考技术A 添加字段并附值
alter table TABLE_NAME ADD COLUMN_NAME NUMBER(1) DEFAULT 1;修改字段值update TABLE_NAME set filedname=value where filedname=value;
修改字段数据类型
alter table tablename modify filedname varchar2(20);1SQLselect*fromv$version;23BANNER4--------------------------------------------------------------------------------5OracleDatabase11g Enterprise Edition Release11.2.
0.1.0-64bitProduction6PL/SQL Release11.2.
0.1.0-Production7CORE11.2.
0.1.0Production8TNSforLinux: Version11.2.
0.1.0-Production9NLSRTL Version11.2.
0.1.0-Production
1.修改字段数据类型时,如果该列有数据则报ORA-01439: column to be modified must be empty to change datatype,此时需要通过另外一种方法修改:1SQLaltertablezytaddid_tempvarchar2(10);23Tablealtered.45SQLcommit;67Commitcomplete.89SQLselect*fromzyt;1011NAME ID ID_TEMP12---------- ---------- ----------13zyt1114david21516SQLaltertablezyt renamecolumnidtoid_bak;1718Tablealtered.1920SQLselect*fromzyt;2122NAME ID_BAK ID_TEMP23---------- ---------- ----------24zyt1125david22627SQLdesczyt;28NameNull? Type29----------------------------------------- -------- ----------------------------30NAMEVARCHAR2(10)31ID_BAKNOTNULLNUMBER(2)32ID_TEMPVARCHAR2(10)3334SQLupdatezytsetID_TEMP=cast(ID_BAKasvarchar2(10));35362rows updated.3738SQLcommit;3940Commitcomplete.4142SQLselect*fromzyt;4344NAME ID_BAK ID_TEMP45---------- ---------- ----------46zyt11147david224849SQLaltertablezytdropcolumnID_BAK;5051Tablealtered.5253SQLcommit;5455Commitcomplete.5657SQLselect*fromzyt;5859NAME ID_TEMP60---------- ----------61zyt1162david26364SQLdesczyt;65NameNull? Type66----------------------------------------- -------- ----------------------------67NAMEVARCHAR2(10)68ID_TEMPVARCHAR2(10)备注:这种方法能满足需求,因新增字段默认添加到表末尾,有可能发生行迁移,对应用程序会产生影响,同时也涉及复杂数据,不算最好的方法
2.建立一个中间跳板,临时存储数据1SQLdesczyt;2NameNull? Type3----------------------------------------- -------- ----------------------------4NAMEVARCHAR2(10)5IDVARCHAR2(10)67SQLselect*fromzyt;89NAME ID10---------- ----------11zyt1112david21314SQLaltertablezytaddid_tempVARCHAR2(10)1516Tablealtered.1718SQLselect*fromzyt;1920NAME ID ID_TEMP21---------- ---------- ----------22zyt1123david22425SQLupdatezytsetID_TEMP=id,id=null;26272rows updated.2829SQLselect*fromzyt;3031NAME ID ID_TEMP32---------- ---------- ----------33zyt1134david23536SQLaltertablezyt modify idnumber(10);3738Tablealtered.3940SQLdesczyt;41NameNull? Type42----------------------------------------- -------- ----------------------------43NAMEVARCHAR2(10)44IDNUMBER(10)45ID_TEMPVARCHAR2(10)4647SQLupdatezytsetid=ID_TEMP,ID_TEMP=null;48492rows updated.5051SQLselect*fromzyt;5253NAME ID ID_TEMP54---------- ---------- ----------55zyt1156david25758SQLaltertablezytdropcolumnID_TEMP;5960Tablealtered.6162SQLcommit;6364Commitcomplete.6566SQLselect*fromzyt;6768NAME ID69---------- ----------70zyt1171david27273SQLdesczyt;74NameNull?本回答被提问者采纳

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)




































以上是关于【原】Oracle 如何修改列的数据类型的主要内容,如果未能解决你的问题,请参考以下文章

修改DataTable中某列的数据类型.

c#如何修改DataTable里面的特定列的数据类型

oracle怎么修改表中的数据类型

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

Oracle修改字段名、字段数据类型

Oracle 缺少表列的 Bit 数据类型