sql >> Databasteknik >  >> RDS >> Oracle

Hur blir man av med en tom men enorm LOB-kolumn?

Som ett alternativ till att ta bort och lägga till kolumnen igen kan du använda shrink space klausul :

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

db<>fiol , vilket är 18c men borde fungera i 11g också. (Senare:ja, det gör det i 11gR2 med retention none utelämnad ändå; SQL Fiddle gillar det dock inte.)

Missade den detaljen, men den fungerar ändå; du behöver bara ett extra steg för att hitta den dolda BLOB-kolumnen som säkerhetskopierar XMLType-kolumnen, som visas här . Jag har gjort alter dynamisk bara för att plocka upp det i farten, men om du kan hitta det manuellt kan du självklart koppla in det i uttalandet själv:

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

Förmodligen värt att notera att detta fungerar med basicfile lagring, som visas i din minimala demo, men kanske inte fungerar med securefile lagring - åtminstone en del av tiden som ger ORA-10635:Ogiltigt segment eller tabellutrymmestyp.




  1. Hur man byter ut en sträng i en SQL Server-tabellkolumn

  2. MySql kan inte uppdatera överordnad rad när jag har ON UPDATE CASCADE

  3. Uppdatera flera rader i en kolumn i MySQL

  4. När skulle du använda en tabellvärderad funktion?