Als Alternative zum Löschen und erneuten Hinzufügen der Spalte können Sie das shrink space
Klausel
:
ALTER TABLE t MODIFY LOB (c) (SHRINK SPACE);
db<>fiddle
, was 18c ist, aber auch in 11g funktionieren sollte. (Später:ja, in 11gR2 mit retention none
sowieso weggelassen; SQL Fiddle mag es aber nicht.)
Ich habe dieses Detail verpasst, aber es funktioniert immer noch; Sie brauchen nur einen zusätzlichen Schritt, um die versteckte BLOB-Spalte zu finden, die die XMLType-Spalte unterstützt, wie hier gezeigt . Ich habe den alter
gemacht dynamic, nur um das schnell aufzugreifen, aber wenn Sie es manuell finden können, können Sie es natürlich selbst in die Anweisung einfügen:
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;
/
Erwähnenswert ist wahrscheinlich, dass dies mit basicfile
funktioniert Speicher, wie in Ihrer minimalen Demo gezeigt, funktioniert aber möglicherweise nicht mit securefile
Speicher - zumindest manchmal, was ORA-10635 auslöst:Ungültiger Segment- oder Tablespace-Typ.