更改生产数据库中的列数据类型

时间:2011-09-05 17:17:41

标签: oracle plsql

我正在寻找更改已填充表格中列的数据类型的最佳方法。 Oracle仅允许使用空值更改列中的数据类型。

到目前为止,我的解决方案是一个PLSQL语句,它将要修改的列的数据存储在集合中,更改表,然后迭代集合,使用转换的数据类型恢复原始数据。

-- Before: my_table ( id NUMBER, my_value VARCHAR2(255))
-- After: my_table (id NUMBER, my_value NUMBER)

DECLARE
  TYPE record_type IS RECORD ( id NUMBER, my_value VARCHAR2(255));
  TYPE nested_type IS TABLE OF record_type;
  foo nested_type;
BEGIN
  SELECT id, my_value BULK COLLECT INTO foo FROM my_table;
  UPDATE my_table SET my_value = NULL;
  EXECUTE IMMEDIATE 'ALTER TABLE my_table MODIFY my_value NUMBER';
  FOR i IN foo.FIRST .. foo.LAST
  LOOP
    UPDATE my_table 
        SET  = TO_NUMBER(foo(i).my_value) 
        WHERE my_table.id = foo(i).id;
  END LOOP;
END;
/

我正在寻找一种更有经验的方法来做到这一点。

2 个答案:

答案 0 :(得分:6)

解决方案是错误的。 alter table语句执行隐式提交。因此解决方案存在以下问题:

  • 更改alter table语句后无法回滚,如果数据库在alter table语句后崩溃,则会丢失数据
  • 在select和更新之间,用户可以更改数据

相反,你应该看看oracle在线重新定义。

答案 1 :(得分:5)

您的解决方案对我来说有点危险。将值加载到集合中,然后从表中删除它们意味着这些值现在仅在内存中可用。如果出现问题他们会丢失。

正确的程序是:

  1. 向表中添加正确类型的列。
  2. 将值复制到新列。
  3. 删除旧列。
  4. 将新列重命名为旧列名称。
相关问题