table = mytable
temp col = tempcol
col = mycol
目前包含5000行各种值,从99999.99999到0.00001
我需要保持数据创建脚本以创建临时列,将值舍入为7,3将mycol更新为空值,将我的列从10,5修改为7,3将数据返回到mycol,drop临时专栏。完成工作。
到目前为止
SELECT mycol
INTO tempcol
FROM mytable
update mytable set mycol = null
alter table mytable modify mycol number (7,3)
SELECT tempcol
INTO mycol
FROM mytable
drop tempcol
请您填写缺失的空白是否可以直接解决问题。
答案 0 :(得分:4)
首先,NUMBER(10,5)
可以存储-99999到99999的结果,而NUMBER(7,3)
时间间隔仅为[-9999,9999],因此您可能会遇到转换错误。您可能希望将列更改为NUMBER(8,3)
。
现在您的计划看起来很合理:当该列中有数据时,您无法降低列的精度或比例,因此您将数据存储到临时列中。我会这样做:
SQL> CREATE TABLE mytable (mycol NUMBER(10,5));
Table created
SQL> /* populate table */
2 INSERT INTO mytable
3 (SELECT dbms_random.value(0, 1e10)/1e5
4 FROM dual CONNECT BY LEVEL <= 1e3);
1000 rows inserted
SQL> /* new temp column */
2 ALTER TABLE mytable ADD (tempcol NUMBER(8,3));
Table altered
SQL> /* copy data to temp */
2 UPDATE mytable
3 SET tempcol = mycol,
4 mycol = NULL;
1000 rows updated
SQL> ALTER TABLE mytable MODIFY (mycol NUMBER(8,3));
Table altered
SQL> UPDATE mytable
2 SET mycol = tempcol;
1000 rows updated
SQL> /* cleaning */
2 ALTER TABLE mytable DROP COLUMN tempcol;
Table altered