Jako alternatywę dla upuszczania i ponownego dodawania kolumny możesz użyć shrink space
klauzula
:
ALTER TABLE t MODIFY LOB (c) (SHRINK SPACE);
db<>skrzypce
, który ma 18c, ale powinien działać również w 11g. (Później:tak, robi to w 11gR2 z retention none
i tak pominięte; SQL Fiddle jednak tego nie lubi.)
Brakowało tego szczegółu, ale nadal działa; potrzebujesz tylko dodatkowego kroku, aby znaleźć ukrytą kolumnę BLOB tworzącą kopię zapasową kolumny XMLType, jak pokazano tutaj . Wykonałem alter
dynamiczna tylko po to, by wychwycić to w locie, ale jeśli możesz znaleźć to ręcznie, możesz po prostu samodzielnie podłączyć to do instrukcji:
DECLARE
l_name USER_TAB_COLUMNS.COLUMN_NAME%TYPE;
l_stmt VARCHAR2(100);
BEGIN
select column_name
into l_name
from user_tab_cols
where
table_name = 'T' and hidden_column = 'YES'
and
column_id = (
select column_id
from user_tab_cols
where table_name = 'T' and column_name = 'X'
);
l_stmt := 'ALTER TABLE t MODIFY LOB ("' || l_name || '") (SHRINK SPACE)';
dbms_output.put_line(l_stmt);
execute immediate l_stmt;
END;
/
Prawdopodobnie warto zauważyć, że działa to z basicfile
pamięć, jak pokazano w twoim minimalnym demo, ale może nie działać z securefile
pamięć - przynajmniej przez pewien czas, przez który rzuca ORA-10635:Nieprawidłowy typ segmentu lub obszaru tabel.