Au lieu de supprimer et de rajouter la colonne, vous pouvez utiliser le shrink space
clause
:
ALTER TABLE t MODIFY LOB (c) (SHRINK SPACE);
db<>violon
, qui est 18c mais devrait également fonctionner en 11g. (Plus tard :oui, c'est le cas dans 11gR2 avec retention none
omis de toute façon ; SQL Fiddle ne l'aime pas cependant.)
J'ai raté ce détail, mais ça marche toujours; vous avez juste besoin d'une étape supplémentaire pour trouver la colonne BLOB cachée qui sauvegarde la colonne XMLType, comme indiqué ici . J'ai fait le alter
dynamique juste pour le récupérer à la volée, mais si vous pouvez le trouver manuellement, vous pouvez évidemment le brancher vous-même dans l'instruction :
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;
/
Il convient probablement de noter que cela fonctionne avec basicfile
stockage, comme indiqué dans votre démo minimale, mais peut ne pas fonctionner avec securefile
stockage - au moins une partie du temps qui lance ORA-10635 :Type de segment ou d'espace de table non valide.