Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como se livrar da coluna LOB vazia, mas enorme?


Como alternativa para descartar e adicionar novamente a coluna, você pode usar o shrink space cláusula :
ALTER TABLE t MODIFY LOB (c) (SHRINK SPACE);

db<>fiddle , que é 18c, mas também deve funcionar em 11g. (Mais tarde:sim, funciona em 11gR2 com retention none omitido de qualquer maneira; O SQL Fiddle não gosta disso.)

Perdeu esse detalhe, mas ainda funciona; você só precisa de uma etapa extra para encontrar a coluna BLOB oculta que faz backup da coluna XMLType, como mostrado aqui . Eu fiz o alter dynamic apenas para pegar isso em tempo real, mas se você puder encontrá-lo manualmente, basta conectá-lo à declaração você mesmo, obviamente:
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<>fiddle

Provavelmente vale a pena notar que isso funciona com basicfile armazenamento, conforme mostrado em sua demonstração mínima, mas pode não funcionar com securefile armazenamento - pelo menos algumas vezes que lança ORA-10635:Segmento ou tipo de tablespace inválido.