支持alter table move 的数据类型 :raw blob clob

本文通过实验详细阐述了在数据库迁移过程中,raw和blob类型支持move操作,而long和longraw类型无法直接进行move操作的原因。通过创建表并插入不同类型的数据,然后尝试在不同表空间间移动表,实验证明了raw和blob类型的灵活性,同时也揭示了long和longraw类型的局限性。
结论:
支持alter table move 的数据类型 :raw blob clob 
不支持的数据类型 :long 和 long raw

实践是检验真理的最佳方法!

测试过程

1.测试raw和blob类型

SQL> create table t_move (id raw(16),btype blob) tablespace users;
Table created.

SQL> insert into t_move values ('411FC41933DECA4BA6298877EB4446CF',null);
1 row created.

同一个表空间内move操作:

SQL> alter table t_move move tablespace users;

Table altered.

SQL> select * from t_move;
ID
--------------------------------
BTYPE
--------------------------------------------------------------------------------
411FC41933DECA4BA6298877EB4446CF

1 row selected.

跨表空间的move操作:

SQL> alter table t_move move tablespace test;
Table altered.

SQL> select * from t_move;
ID
--------------------------------
BTYPE
--------------------------------------------------------------------------------
411FC41933DECA4BA6298877EB4446CF

1 row selected.

成功。
实验证明 raw和blob类型支持move操作。

2.测试long和long raw类型

SQL> alter table t_move add (high_value long);
Table altered.

SQL> insert into t_move values ('23E23F4E23C97D4AAAB781A9F8F085F2',null,'long')
  2  /

1 row created.

SQL> alter table t_move move tablespace test; 
alter table t_move move tablespace test
*
ERROR at line 1:
ORA-00997: illegal use of LONG datatype

SQL> alter table t_move move tablespace users;
alter table t_move move tablespace users
*
ERROR at line 1:
ORA-00997: illegal use of LONG datatype

失败
实验证明 long类型不能直接move。


SQL> alter table t_move add (high long raw);
alter table t_move add (high long raw)
                        *
ERROR at line 1:
ORA-01754: a table may contain only one column of type LONG

这里注意:long raw实验也是long类型的列,一张表内只能允许一个long类型的列。
所以,删除原long列再添加新long raw列。

SQL> alter table t_move drop column high_value;
Table altered.

SQL> alter table t_move add (high long raw);
Table altered.

SQL> desc t_move
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 RAW(16)
 BTYPE                                              BLOB
 HIGH                                               LONG RAW

SQL> alter table t_move move tablespace test;
alter table t_move move tablespace test
*
ERROR at line 1:
ORA-00997: illegal use of LONG datatype

失败
实验证明 long raw类型不能直接move。


SQL> alter table t_move drop column high;
Table altered.

SQL> alter table t_move add (tc clob);
Table altered.

SQL> desc t_move
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
  ID                                                RAW(16)
 BTYPE                                              BLOB
 TC                                                 CLOB

SQL> alter table t_move move tablespace users;

Table altered.

成功
实验证明 clob类型支持直接move。

SQL> drop table t_move;
Table dropped.

实验结束。
<think>我们遇到了一个Oracle数据库的错误:ORA-22858,尝试将某列的数据类型修改为CLOB时失败。 错误原因分析: 在Oracle中,不能直接将列的数据类型更改为CLOB(或BLOB)类型。这是因为CLOB是大型对象(LOB)类型,Oracle不允许直接修改为LOB类型。 替代方案: 通常,我们需要采取以下步骤来实现将现有列修改为CLOB类型: 1. 添加一个新的临时CLOB列。 2. 将原列的数据更新到新列(可能需要使用TO_CLOB函数转换,如果原列是LONG类型则需要特殊处理)。 3. 删除原列。 4. 重命名新列为原列名。 但是,如果原列已经是LOB类型(如BLOBCLOB、NCLOB)或者是LONG类型,则转换方法有所不同。另外,如果原列是VARCHAR2类型,我们可以尝试直接修改,但是有长度限制(VARCHAR2最大4000字节),而CLOB可以存储更大的数据。但是Oracle不允许直接修改为CLOB。 具体步骤示例(假设表名为aa,列名为STDF_FILES): 注意:操作前请备份数据。 步骤1:添加一个新列(例如STDF_FILES_NEW)为CLOB类型。 ALTER TABLE aa ADD (STDF_FILES_NEW CLOB); 步骤2:将原列的值更新到新列。如果原列是VARCHAR2,则可以直接赋值(Oracle会自动转换),或者使用TO_CLOB函数。 UPDATE aa SET STDF_FILES_NEW = TO_CLOB(STDF_FILES); 注意:如果数据量很大,可能需要分批提交。 步骤3:删除原列。 ALTER TABLE aa DROP COLUMN STDF_FILES; 步骤4:将新列重命名为原列名。 ALTER TABLE aa RENAME COLUMN STDF_FILES_NEW TO STDF_FILES; 但是,如果原列是LONG类型,则不能直接通过UPDATE将LONG转换为CLOB,需要使用PL/SQL过程。不过,从错误信息看,这里原列可能不是LONG,因为错误是ORA-22858,通常出现在尝试直接修改为LOB类型时。 另外,如果表中有约束(例如主键、外键)或索引,需要先删除,然后再重新创建。 还有一种情况,如果列上有默认值,也需要在添加新列时处理默认值。 因此,根据具体情况可能需要调整步骤。 但是,请注意,直接修改列类型为CLOB的操作在Oracle中是不允许的,所以我们必须采用上述的迂回方法。 现在,按照要求,在回答后提出3-5个相关问题。 </think>### 问题分析 错误 `ORA-22858: 数据类型的变更无效` 在 Oracle 中通常发生在尝试直接将列修改为 `CLOB` 类型时。这是因为 Oracle 不允许将现有列直接更改为 LOB 类型(如 `CLOB`、`BLOB`),尤其是当列包含数据或存在索引/约束时。以下是解决方案: ### 解决方案 需通过临时列转移数据: 1. **添加临时 CLOB 列** ```sql ALTER TABLE aa ADD (STDF_FILES_TEMP CLOB); ``` 2. **迁移数据** ```sql UPDATE aa SET STDF_FILES_TEMP = TO_CLOB(STDF_FILES); COMMIT; ``` 3. **删除原列** ```sql ALTER TABLE aa DROP COLUMN STDF_FILES; ``` 4. **重命名临时列** ```sql ALTER TABLE aa RENAME COLUMN STDF_FILES_TEMP TO STDF_FILES; ``` ### 注意事项 - **索引/约束**:若原列有索引或约束(如 `NOT NULL`),需在迁移前手动删除并在重命名后重建。 - **事务备份**:操作前务必备份表数据。 - **兼容性**:若原列为 `LONG` 类型,需改用 `DBMS_LOB` 包迁移数据。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值