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

标签 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;
/

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

最佳答案

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

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

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

    关于oracle - 更改生产数据库中的列数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7311030/

    相关文章:

    mySQL 左连接多个表

    java - 准备好的语句如何提高性能

    sql - 有没有办法从 SQL 查询 AWS RDS Oracle DB 标识符?

    sql - 如何格式化百分比?

    sql - SQL 过程可以返回表吗?

    java - 如何从 Hibernate 用户类型检测数据库?

    sql - Oracle 生成 IW 周日期列表

    Oracle - 记录执行的查询

    oracle - 使用 pl/sql 过程记录错误并处理异常

    php - 每 'X' 分钟从 Oracle 数据库查询并显示结果