Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment se débarrasser d'une colonne LOB vide mais énorme?

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;
/

db<>violon

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.