В качестве альтернативы удалению и повторному добавлению столбца вы можете использовать предложение shrink space
:
ALTER TABLE t MODIFY LOB (c) (SHRINK SPACE);
db <> fiddle , которое 18 c, но должно работать и в 11g. (Позже: да, это есть в 11gR2 с опущенным retention none
; SQL Fiddle это не нравится.)
базовый тип данных - BINARY XML
Пропустил эту деталь, но она все еще работает; вам просто нужен дополнительный шаг, чтобы найти скрытый столбец BLOB, поддерживающий столбец XMLType, , как показано здесь . Я сделал alter
Dynami c, чтобы подобрать его на лету, но если вы можете найти его вручную, вы можете просто вставить его в оператор, очевидно:
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
Вероятно, стоит отметить, что это работает с хранилищем basicfile
, как показано в вашей минимальной демонстрации, но может не работать с хранилищем securefile
- по крайней мере, иногда который выдает ORA-10635: Неверный тип сегмента или табличного пространства.