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

43

我有一个在Oracle数据库中设计为varchar类型的列details,这个数据库现在正在为客户使用,一些行已经存储了数据。

现在我想将details列更改为Clob列。有什么明智的方法可以完成这个任务吗?

4个回答

95

(如前面的答案)这里是代码:

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;

7
如果我们在单个会话中执行此操作,则不需要COMMIT,因为后续的ALTER TABLE语句会发出一个隐式提交(实际上是两个)。 - APC
1
但这样做将无法保持您的列位置。它会将您的列移动到表的末尾。因此,如果您想要保持列的位置,请按照以下步骤操作。 - Sushant Butta
4
抱歉,但我只是在回答问题。如果您使用select * into一个表,那么列的顺序可能很重要,但我首先会质疑这种方法的合理性。 - Kevin Burton

15
  1. 向表中添加一个 CLOB 列
  2. 使用 VARCHAR 列的值更新 CLOB 列
  3. 删除 VARCHAR 列
  4. 将 CLOB 列重命名为 VARCHAR 列的名称

15

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

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; -- 这是必要的,以更改数据类型。 - Marco Z.
这导致我的表上的索引处于“不可用”状态。 - saran3h
这个链接使用相同的解决方案,同时注意索引。 - Pavel S.
对我来说,这种方法行不通,因为即使脚本执行后列被正确更改,最终表也会损坏!我不得不删除表并重新创建它! - Valerio Emanuele

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接