如何在oracle中将列varchar更改为clob

Posted

技术标签:

【中文标题】如何在oracle中将列varchar更改为clob【英文标题】:How to change column varchar to clob in oracle 【发布时间】:2011-10-13 22:48:07 【问题描述】:

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

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

【问题讨论】:

【参考方案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】:
    向表中添加一个 clob 列 使用 varchar 列中的值更新 clob 列 删除 varchar 列 将 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

【讨论】:

以上是关于如何在oracle中将列varchar更改为clob的主要内容,如果未能解决你的问题,请参考以下文章

在 PostgreSQL 中将数据类型“Varchar”更改为“TimeStamp”

Oracle SQL 在包含数据时将列类型从数字更改为 varchar2

尝试在 Oracle Sql 中将列值更改为默认值时标识符无效

Oracle:将 VARCHAR2 列更改为 CLOB

在 MSSQL 中将 bigint 转换为 varchar

如何将复合键列类型从 varchar 更改为 nvarchar?