如何在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