sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo deshacerse de la columna LOB vacía pero enorme?

Como alternativa a eliminar y volver a agregar la columna, puede usar el shrink space cláusula :

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

db<>fiddle , que es 18c pero también debería funcionar en 11g. (Más tarde:sí, lo hace en 11gR2 con retention none omitido de todos modos; Sin embargo, a SQL Fiddle no le gusta.)

Se perdió ese detalle, pero aún funciona; solo necesita un paso adicional para encontrar la columna BLOB oculta que respalda la columna XMLType, como se muestra aquí . He hecho el alter dynamic solo para recogerlo sobre la marcha, pero si puede encontrarlo manualmente, entonces puede simplemente conectarlo a la declaración usted mismo, 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

Probablemente valga la pena señalar que esto funciona con basicfile almacenamiento, como se muestra en su demostración mínima, pero podría no funcionar con securefile almacenamiento:al menos parte del tiempo que genera ORA-10635:segmento o tipo de espacio de tablas no válido.