我在oracle 11g中有一个表T1
T1
(
C1 number,
C2 date default sysdate,
C3 varchar2(20)
);
我想将我的c2列修改为数字(9),但是当我在alter table下面运行时出现错误。
alter table T1 modify C2 number(9); -- getting error .
alter table T1 modify C2 varcha2(10); -- run successfully .
任何人都可以告诉我这个的原因以及我如何修改它而不丢弃并重新创建表格?
答案 0 :(得分:0)
C2列当前定义:
C2 date default sysdate
当您将此列更改为VARCHAR2(10)时,没有问题,因为Oracle使用当前的NLS_SETTINGS(例如日期字符串表示模式)执行从DATE到VARCHAR2的值的隐式转换
当您将列更改为NUMBER(9)时,Oracle无法应用隐式转换(转换矩阵中没有此类规则)。这就是您收到错误的原因。
改变的一种方法是使列为null:
update t1 set c2 = null;
alter table T1 modify C2 number(9);
请注意ALTER是DDL,这意味着它在操作之前和之后执行隐式COMMIT。
如果您需要将数据保存在C2中并将其转换为NUMBER,则可以添加新列,进行转换,删除旧列,然后重命名新列:
alter table T1 add C2_new number(9);
update t1 set c2_new = <your conversion of C2>;
alter table T1 drop column C2;
alter table T1 rename column C2_new to C2;
(不要忘记你不能回滚的DDL)