Jako alternativu k vypuštění a opětovnému přidání sloupce můžete použít shrink space
doložka
:
ALTER TABLE t MODIFY LOB (c) (SHRINK SPACE);
db<>fiddle
, což je 18c, ale mělo by fungovat i v 11g. (Později:ano, dělá to v 11gR2 s retention none
stejně vynecháno; SQL Fiddle to však nemá rád.)
Tento detail mi chyběl, ale stále funguje; stačí další krok, abyste našli skrytý sloupec BLOB zálohující sloupec XMLType, jak je uvedeno zde . Udělal jsem alter
dynamický jen proto, abyste to mohli za chodu zachytit, ale pokud to můžete najít ručně, můžete to samozřejmě sami zapojit do prohlášení:
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;
/
Pravděpodobně stojí za zmínku, že to funguje s basicfile
úložiště, jak je uvedeno ve vaší minimální ukázce, ale nemusí fungovat s securefile
úložiště – alespoň část času, která vyvolá ORA-10635:Neplatný typ segmentu nebo tabulkového prostoru.