Oracle
 sql >> Database >  >> RDS >> Oracle

Come sbarazzarsi della colonna LOB vuota ma enorme?

In alternativa all'eliminazione e alla riaggiunta della colonna è possibile utilizzare lo shrink space clausola :

ALTER TABLE t MODIFY LOB (c) (SHRINK SPACE);

db<>violino , che è 18c ma dovrebbe funzionare anche in 11g. (Più tardi:sì, lo fa in 11gR2 con retention none omesso comunque; A SQL Fiddle non piace però.)

Mi è mancato quel dettaglio, ma funziona ancora; hai solo bisogno di un passaggio in più per trovare la colonna BLOB nascosta che esegue il backup della colonna XMLType, come mostrato qui . Ho fatto la alter dinamico solo per prenderlo al volo, ma se riesci a trovarlo manualmente, puoi semplicemente inserirlo tu stesso nella dichiarazione ovviamente:

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<>violino

Probabilmente vale la pena notare che funziona con basicfile spazio di archiviazione, come mostrato nella tua demo minima, ma potrebbe non funzionare con securefile storage - almeno una parte del tempo che genera ORA-10635:tipo di segmento o tablespace non valido.