考虑以下表格:
CREATE TABLE TAB_ONE
(
<irrelevant columns>
MESSAGE CLOB,
REC_DATE DATE,
<irrelevant columns>
) TABLESPACE DATA_TS;
和
CREATE TABLE TAB_TWO
(
<irrelevant columns>
RESPONSE CLOB,
PART_ID NUMBER,
<irrelevant columns>
CONSTRAINT "FK_01"
FOREIGN KEY ("PART_ID") REFERENCES <IRRELEVANT_TABLE> ("SEQ_ID")
) TABLESPACE DATA_TS PARTITION BY REFERENCE (FK_01) ENABLE ROW MOVEMENT;
现在,任务是将所有(C)LOB从DATA_TS移动到新分配的名为LOB_TS的表空间。
对于第一个表格,这很容易:
ALTER TABLE TAB_ONE MOVE LOB ("MESSAGE") store as (tablespace LOB_TS compress low);
对于另一个,分区会造成所有麻烦。上述命令由于显而易见的原因不起作用,所以我设法找到了另一个:
ALTER TABLE TAB_TWO MOVE PARTITION SYS_P18485 LOB (RESPONSE) STORE AS ( TABLESPACE LOB_TS COMPRESS LOW );
ALTER TABLE TAB_TWO MOVE PARTITION SYS_P18299 LOB (RESPONSE) STORE AS ( TABLESPACE LOB_TS COMPRESS LOW );
(表TAB_TWO
拥有的每个分区都有一个)
这些ALTER TABLES本身并没有失败。 SQL Developer自豪地声明&#34;表TAB_TWO被改变了。&#34;
但后来我跑SELECT * FROM USER_LOBS WHERE TABLE_NAME = 'TAB_TWO'
并发现,CLOB停留在上一个表空间中并且没有移动。
当然,通过Create Table as Select复制数据,删除表,创建新表并恢复数据的想法发生在我身上,但我更喜欢更清洁的解决方案,而无需复制大量数据不同的表。