Como alternativa para descartar e adicionar novamente a coluna, você pode usar o
shrink space
cláusula
:ALTER TABLE t MODIFY LOB (c) (SHRINK SPACE);
db<>fiddle , que é 18c, mas também deve funcionar em 11g. (Mais tarde:sim, funciona em 11gR2 com
retention none
omitido de qualquer maneira; O SQL Fiddle não gosta disso.) Perdeu esse detalhe, mas ainda funciona; você só precisa de uma etapa extra para encontrar a coluna BLOB oculta que faz backup da coluna XMLType, como mostrado aqui . Eu fiz o
alter
dynamic apenas para pegar isso em tempo real, mas se você puder encontrá-lo manualmente, basta conectá-lo à declaração você mesmo, obviamente: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;
/
db<>fiddle
Provavelmente vale a pena notar que isso funciona com
basicfile
armazenamento, conforme mostrado em sua demonstração mínima, mas pode não funcionar com securefile
armazenamento - pelo menos algumas vezes que lança ORA-10635:Segmento ou tipo de tablespace inválido.