Oracle SQL在包含数据时将列类型从数字更改为varchar2

Din*_*Din 3 sql oracle oracle11g

我在Oracle 11g中有一个表(包含数据),我需要使用Oracle SQLPlus来执行以下操作:

目标:改变列的类型TEST1UDA1numbervarchar2.

建议方法:

  1. 备份表
  2. 将列设置为null
  3. 更改数据类型
  4. 恢复值

以下不起作用.

create table temp_uda1 AS (select * from UDA1); 

update UDA1 set TEST1 = null;
commit;

alter table UDA1 modify TEST1 varchar2(3);

insert into UDA1(TEST1)
  select cast(TEST1 as varchar2(3)) from temp_uda1;
commit;
Run Code Online (Sandbox Code Playgroud)

与索引有关(保留顺序),对吧?

a_h*_*ame 26

create table temp_uda1 (test1 integer);
insert into temp_uda1 values (1);

alter table temp_uda1 add (test1_new varchar2(3));

update temp_uda1 
   set test1_new = to_char(test1);

alter table temp_uda1 drop column test1 cascade constraints;
alter table temp_uda1 rename column test1_new to test1;
Run Code Online (Sandbox Code Playgroud)

如果列上有索引,则需要重新创建它.

请注意,如果旧列中的数字大于999,则更新将失败.如果这样,则需要调整varchar列的最大值

  • @Din:为什么不在另一个语句之后运行一个语句并在每个步骤之后检查该表.然后你就会明白每个陈述的作用. (2认同)

mkb*_*mkb 9

将新列添加为varchar2,将数据复制到此列,删除旧列,将新列重命名为实际列名:

ALTER TABLE UDA1
ADD (TEST1_temp  VARCHAR2(16));

update UDA1 set TEST1_temp = TEST1;

ALTER TABLE UDA1 DROP COLUMN TEST1;

ALTER TABLE UDA1 
RENAME COLUMN TEST1_temp TO TEST1;
Run Code Online (Sandbox Code Playgroud)


ibr*_*041 5

查看Oracle的软件包DBMS_REDEFINE。运气好的话,您可以在不停机的情况下在线进行操作(如果需要)。否则,您可以:

  • 添加新VARCHAR2
  • 使用update复制NUMBERVARCHAR2
  • 下降NUMBER
  • 重命名VARCHAR2