【问题标题】:How to change column varchar to clob in oracle如何在oracle中将列varchar更改为clob
【发布时间】:2023-03-12 12:30:01
【问题描述】:

我在 oracle DB 中有一个列details 设计为 varchar,这个 DB 现在正用于客户,并且一些行已经存储了数据。

现在我想将列 details 更改为 Clob 列。有什么聪明的方法可以做到这一点?

【问题讨论】:

    标签: sql oracle oracle10g


    【解决方案1】:

    (如上一个答案)这是代码:

    ALTER TABLE atable
     ADD (tmpdetails  CLOB);
    
    UPDATE atable SET tmpdetails=details;
    COMMIT;
    
    ALTER TABLE atable DROP COLUMN details;
    
    ALTER TABLE atable
    RENAME COLUMN tmpdetails TO details;
    

    【讨论】:

    • +1 如果我们在单个会话中执行此操作,则 COMMIT 是不必要的,因为随后的 ALTER TABLE 语句会发出隐式提交(实际上是两个)。
    • 但这不会保持你的专栏的位置。它会将您的列移动到表格的末尾。因此,如果您想保持列的位置,请按照以下步骤操作。
    • 抱歉,我只是在回答这个问题,我想如果您在表中使用 select *,那么列顺序很重要,但我首先会质疑这种方法的合理性。
    【解决方案2】:
    1. 向表中添加一个 clob 列
    2. 使用 varchar 列中的值更新 clob 列
    3. 删除 varchar 列
    4. 将 clob 列重命名为 varchar 列名称

    【讨论】:

      【解决方案3】:

      但这不会保持您的专栏的位置。它会将您的列移动到表格的末尾。因此,如果您想保持列的位置,请按照以下步骤操作。

      alter table atable add (tempdetails varchar2(4000));
      update atable set tempdetails = details;
      update atable set details = null;  -- this is necessary to change data type
      alter table atable modify details long;  -- this is required because you can not change directly to clob.
      alter table atable modify details clob;
      update atable set details=tempdetails;
      alter table atable drop column tempdetails;
      

      即使在更改数据类型后,您也可以通过这种方式保持列的数据和位置不变。有关示例的详细信息,请参见此处:http://www.oraclebin.com/2012/12/how-to-change-varchar2-to-clob-datatype.html

      【讨论】:

      • 您好,这个答案是有效的,但第三条语句必须更改如下:update atable set details = null; -- 这是更改数据类型所必需的
      • 这导致我在表上的索引处于UNUSABLE 状态。
      • 这个link 使用相同的解决方案,另外还要注意索引。
      • 对我来说,这种方法行不通,因为在执行脚本后即使正确更改了列,表最终还是损坏了!我不得不删除表并重新创建它!
      【解决方案4】:

      如果您需要在此过程中访问您的表数据.. 看看 DBMS_REDEFINITION

      在 asktom 上查看类似问题 http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1770086700346491686

      【讨论】:

        猜你喜欢
        • 2016-07-04
        • 2012-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-23
        • 1970-01-01
        • 2020-05-22
        • 2021-11-13
        相关资源
        最近更新 更多