Som ett alternativ till att ta bort och lägga till kolumnen igen kan du använda shrink space
klausul
:
ALTER TABLE t MODIFY LOB (c) (SHRINK SPACE);
db<>fiol
, vilket är 18c men borde fungera i 11g också. (Senare:ja, det gör det i 11gR2 med retention none
utelämnad ändå; SQL Fiddle gillar det dock inte.)
Missade den detaljen, men den fungerar ändå; du behöver bara ett extra steg för att hitta den dolda BLOB-kolumnen som säkerhetskopierar XMLType-kolumnen, som visas här . Jag har gjort alter
dynamisk bara för att plocka upp det i farten, men om du kan hitta det manuellt kan du självklart koppla in det i uttalandet själv:
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;
/
Förmodligen värt att notera att detta fungerar med basicfile
lagring, som visas i din minimala demo, men kanske inte fungerar med securefile
lagring - åtminstone en del av tiden som ger ORA-10635:Ogiltigt segment eller tabellutrymmestyp.